java反射

2020-05-08  本文已影响0人  remax1

什么是反射机制

java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法。对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

反射基础

·Class:Class对象是一个特殊的对象,java实例对象是通过Class对象创建的,每个类运行时的类信息就是用Class对象来表示的,即后缀名为class的文件。
·Field:Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段,即类的成员变量。
·Method:Method方法提供了关于单个方法的信息和访问在类或接口上。反射的方法可能是类方法或者是一个实例方法(包括一个抽象的方法)。
·Constructor:Constructor提供了关于类的构造方法。
·Array:提供了动态创建数组,以及访问数组的元素的静态方法。

反射中的相关方法

  1. 获取Class对象的方法
private void demo(){
        LocateBean locateBean = new LocateBean();
        //第一种方法
        Class c1 = LocateBean.class;//任何一个类都有一个隐含的静态成员变量class。不执行静态块和动态构造块
        //第二种方法
        Class c2 = locateBean.getClass();//已有实例对象,可通过getClass()来获取Class对象。静态块和动态块都会执行
        //第三种方法
        Class c3 = Class.forName("com.lxxl.ailayout.LocateBean");//通过全路径拿到Class对象,只执行静态块
        
    }

对于类LocateBean来说,locateBean就是类LocateBean的实例化对象。
对于类Class来说,LocateBean就是类Class的实例化对象。

2.成员变量的反射,即类的属性

       c3.getField("fieldName");//只能获取public修饰的字段
       c3.getFields();//获取所有public修饰的字段Field数组
       c3.getDeclaredField("fieldName");//可以获得所有字段
       c3.getDeclaredFields();//获取所有字段的Field数组

成员变量也是对象,是java.lang.reflect.Field类得对象,也就是说,Field类封装了关于成员变量得所有操作。

3.方法Method的反射

        c3.getMethod("methodName");//只能获取public修饰的方法名称
        c3.getMethods();//获取所有public修饰的方法的Method数组
        c3.getDeclaredMethods();//可以获得所有方法
        c3.getDeclaredMethod("methodName");//指定方法

4.构造方法的反射

        c3.getConstructor(); //只能获取public修饰的方法名称
        c3.getConstructors();// 获取所有public修饰的构造方法的数组
        c3.getDeclaredConstructor(); //可以获得指定构造方法
        c3.getDeclaredConstructors(); //获取所有构造方法的数组

构造函数也是对象,是java.lang.Constructor类的对象,也就是说,Constrctor中封装了构造函数的信息。

5.数组的反射

 //使用Array.newInstance创建数组
        //第一个参数代表数组元素类型
        //第二个参数代表数组长度
       int[] intArray = (int[]) Array.newInstance(int.class,4);
       //设置数组元素
       Array.set(intArray,1,111);
       //获取数组元素
        Array.get(intArray,1);

数组也是对象,是java.lang.reflect.Array的对象。也就是说,Array中封装了数组信息。

注意事项

当操作的对象用private修饰的时候需要用method.setAccessible(true)来设置可以访问到
然后调用method.invoke(Object obj,参数),这个Object的对象必须是该类的对象。

上一篇 下一篇

猜你喜欢

热点阅读