反射机制提供了运行时访问类内信息的方法,每个类由虚拟机加载到方法区后都会生一个一个对应的class对象,通过这个对象可以获取构造函数,定义的字段以及注解、方法等信息。
获取class对象常用三种方式
1.调用对用Myclass.class
2.调用通过Myclass的对象实例myclass的getClass()方法。
3.Class.forName("MyClass"), 参数必须是完整的类名(包括包名),可以用Class.getName()获得。
1.访问构造函数
Class<?> clazz=Class.forName(TestAnnotation.class.getName());
Constructor<?> constructor=clazz.getConstructor();
// Constructor<?> constructor1=clazz.getDeclaredConstructor();
Constructor[] consArr=clazz.getConstructors();
Constructor[] consArr1=clazz.getDeclaredConstructors();
TestAnnotation annotation=(TestAnnotation) constructor.newInstance();
getConstructor()与getDeclaredConstructor()可以或者一个构造函数,前者获得public构造函数,后者可以获得所有构造函数,参数中传入构造函数中参数对应的Class类型从而获得指定的构造函数。
getConstructors()与getDeclaredConstructors()可以获得构造函数数组,前者返回所有public修饰的构造函数,后者返回所有构造函数。
通过得到的构造函数对象constructor的newInstance()可以创建对象,类似 new 一个对象。
通过setAccessible(true)可以设置非public构造函数访问权限,使其可以被访问。该方法Constructor,Field,Method均可以使用。
2.获得Field字段变量
加入在类中定义了字段id
public int id;
则可以通过如下代码来获取id字段
Field field=clazz.getField("id");
Field field1=clazz.getDeclaredField("id");
int i=(int)field.get(annotation);
getField()与getDeclareField()方法可以获取对应字段,参数是该字段的名字。
使用field的get()可以获取到被反射类的实例对象对应字段的值。
3获得类中定义的方法Method
例如类中定义了一个方法func(), 为public ,void返回值,与一个int参数i。
public void func(int i)
{
}
则可以通过
Method method=clazz.getMethod("func",int.class);
Method method1=clazz.getDeclaredMethod("func",int.class);
来得到Method对象,参数中第一个为方法的名称,后面为不定数量的Class对象,分别对应定义的方法中参数的类型。
也可以通过getMethods()来获得所有方法。
Method[] methods1=clazz.getMethods();
Method[] methods=clazz.getDeclaredMethods();
得到对应的method对象后可以使用invoke()来调用该方法。
method.invoke(annotation,5);
第一个参数为调用的实例对象,之后为不定数量的参数对应着定义的方法中的参数。则上面的语句就会调用 annotation对象的func(5)方法。
网友评论