1. 反射机制
-
反射机制是指在运动状态中,动态获取信息以及动态调用对象方法的功能。
-
反射有3个动态性质 运行时生成对象实例 运行期间调用方法 运行时更改属性
-
反射可以实现一下功能 运行时判断任意一个对象所属的类 运行时构造任意一个类的对象 运行时判断一个类所有的属性和方法 运行时是调用任意一个对象的方法
-
反射常用API Class类:反射的核心类,反射的所有操作都是围绕该类来生成的。通过Class类可以获取类的属性,方法等内容信息。 Field类:表示类的属性,可以获取和设置类中的属性值。 Method类:表示类的方法,可以用来获取类中方法的信息,或者执行方法。 Constructor类:表示类的构造方法。
2.获取Class对象的方式
- 调用Object中的getClass()方法,所有java对象都可以调用该方法,返回一个Class对象。
- 调用类的class属性,调用某个类的class属性可以获取该类的对应Class对象。
- 使用Class类的forName()静态方法
3. 从Class对象获取信息(了解方法即可)
- 访问Class对应类的所有构造方法
- getConstructor(Class[] params):返回此Class对象所包含的类的指定的public构造方法。params是指构造方法的参数类型。
- getConstructors():返回此Class对象所包含的类的所有public构造方法
- getDeclaredConstructor(Class[] params):返回此Class对象所包含的类的指定的构造方法,与访问修饰符无关。
- getDeclaredConstructors():返回此Class对象所包含的类的所有构造方法,与访问修饰符无关。
- 访问Class对应的类的所有方法
- getMethod(String name,Class[] params):返回此Class对象所包含的类的指定的public方法。name:方法名。params:该方法的参数类型。
- getMethods():返回此Class对象所包含的类的所有public方法。
- getDeclaredMethod(String name,Class[] params):返回此Class对象所包含的类的指定方法,与访问修饰符无关。
- getDeclaredMethods():返回此Class对象所包含的类的所有方法,与访问修饰符无关。
- 访问Class对应的类的所有属性
- getField(String name):返回此Class对象所包含的类的指定public属性。name:用于指定属性名称。
- getFields():返回此Class对象所包含的类的所有public属性。
- getDeclaredField(String name):返回此Class对象所包含的指定的属性,与访问修饰符无关。
- getDeclaredFields():返回此Class对象所包含的类的全部属性,与访问修饰符无关。
- 访问Class对应的类的所有注解
- 和获取属性、方法的操作类似。(请查阅API自行操作)
- 访问Class对应的类的其他信息
- getInterfaces():返回该Class对象对应类所实现的全部接口。
- getPackage():获取此类的包。
- getName():以字符串的形式返回此Class对象所表示的类的名称。
- getSuperclass():返回该Class所表示的类的超类对应的Class对象
更多方法请查阅API自行学习
4. 创建对象
- 通过反射来创建对象有如下两种方式
- 使用Class对象的newInstance()方法创建对象。
但是该方法只能通过该类的无参方法创建对象,如果这个类没有提供无参的构造方法就会抛出异常。 - 使用Constructor对象创建对象
5. 使用Field对象可以对类的属性进行取值或赋值
- Xxx getXxx(Object obj):Xxx对应八个基本数类型,obj为该属性所在的对象。例如:
- get(Object obj):得到引用类型属性值。
- setXxx(Object , Xxx val):将obj对象的该值设置成val.Xxx对应八个基本数据类型。
- set(Object obj , Object val):将obj对象的该属性值设置成val值,针对引用类型赋值。
- setAccessible(Boolean flag):对获取到的属性设置访问权限。参数为true,可以对私有属性取值和赋值。
- getDeclaredField():获取各种访问级别的属性。
6.使用Method对象可以调用对象的方法
Object invoke(Object obj , Object args)
obj:执行该方法的对象
args:执行该方法时传入该方法的参数。无参时传入null。
- 如果程序需要调用某个对象私有方法,可以先调用setAccessible()方法,将Method对象的accessible表示设置为指示的布尔值,值为true则表示该Method在使用时取消Java语言访问权限检查;值为false则表示使用时应该进行Java语言访问权限检查。
7.使用Array类动态创建和访问数组
java.lang.reflect 包下还提供了一个Array类,此Array类的对象可以代表所有的数组。程序可以通过使用Array类来动态地创建数组、操作数组元素等。(实际使用请查阅API)