Java反射机制详解

作者:Array_new 时间:2023-05-20 11:09:47 

什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

哪里用到反射机制

JDBC中,利用反射动态加载了数据库驱动程序。

Web服务器中利用反射调用了Sevlet的服务方法。

Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。

很多框架都用到反射机制,注入属性,调用方法,如Spring。

* 是什么

有哪些应用?

* 是运行时动态生成代理类。

* 的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。

怎么实现 *

JDK 原生 * 和 cglib * 。

JDK 原生 * 是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。

Java反射机制的作用

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

Java 反射机制的优缺点

优点:

  • 能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。

  • 与 Java 动态编译相结合,可以实现无比强大的功能。

  • 对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

缺点:

  • 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;

  • 反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。

如何使用Java的反射

通过一个全限类名创建一个对象

Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了

类名.class; 获取Class<?> clz 对象

对象.getClass();

获取构造器对象,通过构造器new出一个对象

Clazz.getConstructor([String.class]);

Con.newInstance([参数]);

通过class对象创建一个实例对象(就相当与new类名()无参构造器)

Cls.newInstance();

通过class对象获得一个属性对象

Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。

Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段

通过class对象获得一个方法对象

Cls.getMethod(&ldquo;方法名&rdquo;,class&hellip;&hellip;parameaType);(只能获取公共的)

Cls.getDeclareMethod(&ldquo;方法名&rdquo;);(获取任意修饰的方法,不能执行私有)

M.setAccessible(true);(让私有的方法可以执行)

让方法执行

Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)

//测试类
public class Demo {
   public String name;
   public void inputAndoutput {
       BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
       BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       String aa;
       while ( !(aa= br.readLine()).equals("bye")){
           bufferedWriter.write(aa);
           bufferedWriter.newLine();
           bufferedWriter.flush();
       }
       br.close();
       bufferedWriter.close();
   }
   public Demo(){
   }
   public void print(){
   System.out.println(this.name);
   }
   public void reverseWords(String s) {
   System.out.println(s);
return s;
   }
}
//利用反射
 Class c=new Demo().getClass();
       System.out.println(c.toString());
       Class[] classes=c.getClasses();
       for (Class ca:classes){
           System.out.println(ca.toString());
       }
       Arrays.stream(c.getFields()).forEach(s->{
           System.out.println(s.toString());
       });

来源:https://blog.csdn.net/Array_new/article/details/126907135

标签:Java,反射,机制
0
投稿

猜你喜欢

  • Android实现带圆环的圆形头像

    2021-09-30 09:04:47
  • 详解C#对XML、JSON等格式的解析

    2022-06-04 22:45:50
  • C# 并行和多线程编程——认识和使用Task

    2022-03-28 05:48:04
  • Android自定义TextView实现drawableLeft内容居中

    2022-04-24 18:20:14
  • 详解spring boot使用@Retryable来进行重处理

    2021-07-11 18:34:11
  • 利用java制作简单的音乐播放器

    2022-01-21 11:39:32
  • Windows 10上JDK环境安装配置图文教程

    2023-05-31 19:38:03
  • android studio节省C盘空间的配置方法

    2023-07-04 16:43:20
  • JVM 心得分享(加载 链接 初始化)

    2023-09-01 19:17:50
  • C#实现字体旋转的方法

    2023-01-19 06:41:40
  • Android onCreate( )方法详细介绍

    2023-02-24 12:27:07
  • 用Rational Rose逆向工程(java)生成类图(教程和错误解决)

    2023-05-20 20:34:14
  • Java多线程编程之读写锁ReadWriteLock用法实例

    2021-10-13 17:01:14
  • IntelliJ IDEA多屏后窗口不显示问题解决方案

    2022-11-17 14:40:45
  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    2022-05-14 03:39:32
  • 详解备忘录模式及其在Java设计模式编程中的实现

    2023-08-24 22:34:02
  • 详解java中的Collections类

    2022-02-14 16:30:00
  • Android 自定义ProgressDialog进度条对话框用法详解

    2022-02-14 19:31:04
  • Android之Gallery使用例子

    2021-06-16 22:19:38
  • Android 添加系统设置属性的实现及步骤

    2021-12-31 01:11:02
  • asp之家 软件编程 m.aspxhome.com