Java的反射机制
java的反射机制:
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。
这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制
Class 类与 java.lang.reflect 类库,其中常用的类有Constructor,Field,Method类等,AccessibleObject类是前面三个类的基类,主要包含设置安全性检查等方法一起对反射的概念进行了支持。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。这样你就可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用 invoke() 方法调用与 Method 对象关联的方法。另外,还可以调用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。
获取类对象类:
在类加载的时候,jvm会创建一个class对象
class对象是可以说是反射中最常用的,获取class对象的方式的主要有三种
- 根据类名:类名.class
- 根据对象:对象.getClass()
- 根据全限定类名:Class.forName(全限定类名)
获取构造函数:
Constructor<?>[] constructors = class对象.getConstructors();
Constructor constructor1 = class对象.getConstructor();
Constructor constructor2 = class对象.getConstructor(String.class);
利用构造函数可以获得构造函数的参数数量:
Class<?> parameterTypesClass[] = constructors[i].getParameterTypes();
并可以利用构造函数进行实例化:
constructors[0].newInstance());
获取属性(Filed):
Field fields[] = class对象..getDeclaredFields();
Field fieldUserName = class对象..getDeclaredField("属性名");
//getDeclaredField是可以获取一个类的所有字段.
//getField只能获取类的public 字段.
// 取消安全性检查,设置后才可以获取或者修改private修饰的属性,也可以单独对某个属性进行设置 Field.setAccessible(fields, true);
利用filed自身的方法可获得属性的名字、属性的实例中的值、属性的类型
调用属性的get、set方法:
field.get(对象实例)
field.set(对象实例,“新值”)
获取方法:
Method[] methods = userClass.getDeclaredMethods();
// 取消安全性检查,设置后才可以调用private修饰的方法,也可以单独对某个方法进行设置
Method.setAccessible(methods, true);
利用fMethod自身的方法可获得方法名、方法的返回值。
"方法名:" + method.getName() + " \t返回类型:" + method.getReturnType().getName()
利用invoke调用方法:
Method getMethod = userClass.getDeclaredMethod("getName");`
`getMethod.setAccessible(true);`
`"调用getName方法:" + getMethod.invoke(user)`
`Method setMethod = userClass.getDeclaredMethod("setName", String.class);`
`setMethod.invoke(user, "韦德")