• java反射机制


    1.java反射机制的作用:
            使java具备了动态性,可以在运行时构造任意一个类的对象,可以在运行时获取任意类的任意成员,并修改其成员变量或者调用其方法。写程序时(比如 框架)无法知道将来要被调用的类名,所以,无法new对象。所以,反射机制解决了框架要解决的核心问题。反射就是把java类中的各个成分映射成相应的 java类。比如:成员变量映射到Field类。
    2.反射机制的主要成员类。
             Class类:位于java.lang包中,Class类的实例对象是某个类的字节码。
             以下类均位于java.lang.reflect包中:
             Field 类:代表类的成员变量。该类提供一系列方法操作成员变量         Method类:代表类的方法。提供invoke方法,用以调用方法。
             Constructor 类:Constructor 提供关于类的单个构造方法的信息以及对它的访问权限
             Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
             Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
    3.简单示例。
             ⑴.获取Class字节码的三种方式:

        // 1.Class类中提供的forName()方法,接受完整类名,获取字节码。
                        Class cls1 = Class.forName("java.lang.String");
                        // 2.使用类名.class
                        Class cls2 = String.class;
                        // 3.使用对象.getClass();该方法位于Object类中,返回运行时类。
                        Class cls3 = new String("abc").getClass();
    

             ⑵.获取类中成员,属性和方法:

        //                获取所有成员变量,包括私有、和受保护的。用数组接收并遍历打印。
                        Field[]  fields = cls1.getDeclaredFields();
                        for (Field field : fields)
                        {
                                System.out.println(field);
                        }
                        System.out.println("-----------------------以下为方法-------------------------------");
        //                获取所有成员方法,包括私有、和受保护的。用数组接收并遍历打印。
                        Method[] methods = cls2.getDeclaredMethods();
                        for (Method method : methods)
                        {
                                System.out.println(method);
                        }
    

           ⑶.反射获取构造函数,并构建对象:

        //                获取带一个String类型参数的构造函数,并使用该方法构建对象。
                        Constructor constructor = cls3.getDeclaredConstructor(String.class);
                        String str1 = (String)constructor.newInstance("hys");
                        System.out.println(str1);
        //                如果只需要用到无参构造函数,可以使用以下方法:
                        String str2 =(String)Class.forName("java.lang.String").newInstance();
    

             ⑷.获取所需方法,并调用,以String类中concat()方法为例:

        //                获取String类中的concat()方法。
                        Method method1 = String.class.getDeclaredMethod("concat", String.class);
        //                调用concat()方法。
                        String newString = (String) method1.invoke(str1, "--->syh");
        //                输出结果为:hys--->syh
                        System.out.println(newString);
    

         ⑸.数组的反射及应用。
             具有相同类型和相同维数的数组,字节码相同。如:

                         int[] arr1 = new int[3];
                         int[] arr2 = new int[4];
        //                 输出:true
                         System.out.println(arr1.getClass()==arr2.getClass());
    

             使用数组:

                        Class str = Class.forName("java.lang.String");
        //                创建String类的数组,长度为10.
                        Object arr = Array.newInstance(str, 10);
        //                设置第七个对象的值。
                        Array.set(arr, 7, "Hello,itcast!");
                        String str7 = (String)Array.get(arr, 7);
        //                输出结果为:Hello,itcast!
                        System.out.println(str7);
    

             ⑹.反射类关系图:

  • 相关阅读:
    Java 学习总结(一)
    每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容
    每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
    HighCharts使用心得
    ECharts使用心得总结(二)
    每日学习心得:Js基本数据类型常用方法扩展
    每日学习心得:$.extend()方法和(function($){...})(jQuery)详解
    Mustache 使用心得总结
    Extjs editor 设置默认值
    Ext this.getView(...).saveDocumentAs is not a function
  • 原文地址:https://www.cnblogs.com/congyue/p/3085908.html
Copyright © 2020-2023  润新知