什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
简而言之,我们可以拿到这个类中所有的东西。
使用
我们使用反射,一般会使用下面的这几个类
类名 | 使用 |
---|---|
class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
对于里面每个类有什么特别细致的方法,我这里就不在赘述,我们直接谈流程
1,获取Class对象
Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法。
我们获取class对象的方式有是三种,假设我们有个Test类
//Test test = new Test();
//1,通过Class的forName静态方法获取
Class cls = Class.forName("nb.test.Test"); //参数为全类名
//2,通过类获取
Class cls = Test.class;
//3,通过对象获取
Class cls = test.getClass(); //test为Test的对象
2,拿到Class对象能干什么呢?
拿到Class对象,可以拿到里面属性的值,可以运行里面的方法,里面都分两对方法,根据名字和获取所有,然后获取还分为获取公共的和私有的,当获取私有的,要使用暴力反射(setAccessible(true))。
对于属性的获取
方法 | 作用 |
---|---|
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
如果我们要拿私有对象,记得要暴力反射。
对于注解的获取
方法 | 作用 |
---|---|
getAnnotation(Class</A/> annotationClass) | 返回该类中与参数类型匹配的公有注解对象 |
getAnnotations() | 返回该类所有的公有注解对象 |
getDeclaredAnnotation(Class</A/> annotationClass) | 返回该类中与参数类型匹配的所有注解对象 |
getDeclaredAnnotations() | 返回该类所有的注解对象 |
对于构造器的获取
方法 | 作用 |
---|---|
getConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
对于方法的获取
方法 | 作用 |
---|---|
getMethod(String name, Class…<?> parameterTypes) | 获得该类某个公有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class…<?> parameterTypes) | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
还有一些其他的方法判断数组类接口什么的
以上的方法都是成对出现的,带有Declared的方法都是可以获取到private修饰的
使用反射机制创建对象
假设我们有一个main类,第一种使用的是Class对象直接创建,第二种是使用构造方法创建
Class cc = Main.class;
Main mm;
mm = (Main)cc.newInstance(); //第一种
Constructor constructor = cc.getConstructor(); //第二种
mm = (Main)constructor.newInstance();