java反射机制总结(超详细)

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,...);

猜你喜欢

转载自blog.csdn.net/ILIKETANGBOHU/article/details/127205040