美文网首页
反射基础

反射基础

作者: MacroZH | 来源:发表于2018-04-26 20:47 被阅读0次

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

    相关文章

      网友评论

          本文标题:反射基础

          本文链接:https://www.haomeiwen.com/subject/wrpmlftx.html