Java反射机制

声明:
本文参考文章:
https://blog.csdn.net/qq_44715943/article/details/120587716
https://baijiahao.baidu.com/s?id=1722735740852260951&wfr=spider&for=pc


一、反射机制的作用

Java中的编译类型有两种:
1、静态编译:在编译时确定类型,绑定对象即通过。
2、动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以降低类之间的耦合性。

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers、superclass,实现哪些interfaces,也包括fields和methods的所有信息,并且可以在运行时改变fields内容或调用methods。

Reflection可以在运行时加载、探知、使用编译期间完全未知的classes。即Java程序可以加载一个运行时才得知名称的class,获得其完整构造,并生成其对象,或对其fields设置,或调用其methods。

反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构和行为。程序在运行时的行为都是固定的,如果想在运行时改变,就需要用到反射。反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现。例如热加载、Tomcat的classloader等都没法支持。

二、反射相关的类

java.lang.Class 代表整个字节码。代表一个类型,代表整个类。
java.lang.reflect.Method 代表字节码中的方法字节码。代表类中的方法。
java.lang.reflect.Constructor 代表字节码中的构造方法字节码。代表类中的构造方法。
java.lang.reflect.Field 代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。
注:必须先获得Class才能获取Method、Constructor、Field。

三、获取class的三种方法

Class.forName(“完整类名带包名”) 静态方法。如果你只是希望一个类的静态代码块执行,其它代码一律不执行,可以使用这种方式。
对象.getClass()
任何类型.class
注:以上三种方式返回值都是Class类型。

四、通过反射实例化对象

1、对象.newInstance()
注:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。
否则会抛出java.lang.InstantiationException异常。
2、先获取到这个有参数的构造方法【用ClassgetDeclaredConstructor()方法获取】;调用构造方法new对象【用Constructor类的newInstance()方法new对象】
注: 如果需要调用无参构造方法,getDeclaredConstructor()方法形参为空即可【和Class类的newInstance()方法一样的效果】!

五、Field类中set()、get()使用注意事项

属性.set(对象, 值);
属性.get(对象);

不能给private属性set值,需要打破封装。
public void setAccessible(boolean flag):默认false,设置为true为打破封装。

六、Method类中invoke()使用注意事项

方法.invoke(对象, 实参);

你可能感兴趣的:(Java反射机制)