反射基础

2018-04-26  本文已影响0人  MacroZH

反射机制提供了运行时访问类内信息的方法,每个类由虚拟机加载到方法区后都会生一个一个对应的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)方法。

上一篇 下一篇

猜你喜欢

热点阅读