Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
1.1 获得class的三种方法
第一种:
Class c = Class.forName("完整类名");//包括所在包
第二种:
Class c = 对象.getClass();
第三种:
Class c = int.class;
Class c = String.class;
1.2 获得属性
//获得public属性
Field f1 = c.getField("service1");
//获得全部属性(包括私有属性)
c.getDeclaredFields();
1.3 获得方法及修饰符,参数
//获取去类中的所有方法,返回一个method数组
Method[] methods = c.getDeclaredMethods();
//获取当前方法的修饰符参数
int modifiers = method.getModifiers();
//通过"Modifiers. PUBLIC"可以指定修饰符
//获取该方法的参数
Class<?>[] types= method.getParameterTypes();
1.4 invoke实现方法调用
invoke(Object obj, Object… args) 是method 类中的方法,这个方法是一个native 方法
obj: 调用类的实例对象
args:调用发方法的参数,是可变长度的
通过 method.invoke(obj , args ) 可以实现method 方法的调用,并通过args 参数传参。
1.5 获取指定的class上面的注解
System.out.println(Arrays.toString(c.getAnnotations()));
1.6 判断这个类型、方法、属性上是否加了某注解
System.out.println(c.isAnnotationPresent(Table.class));
1.7 通过注解的实例获得注解的参数
Table instance = c.getAnnotation(Table.class);
System.out.println(instance.value());
1.8 通过获得属性得到属性的值
CustomerController c1 = new CustomerController();
c1.setUserName("Demo");
Class<?> clazz = CustomerController.class;
//得到属性名为username的属性
Field userName = clazz.getDeclaredField("userName");
//方法为private时一定要添加setAccessible
userName.setAccessible(true);
//获得该属性的值
System.out.println(userName.get(c1)); // Demo
1.9 newInstance 创建实例
Object instance = clazz.newInstance();
//经常与invoke搭配使用,实现方法的调用
...method.invoke(instance,...);