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);

         ⑹.反射类关系图:

原文地址:https://www.cnblogs.com/congyue/p/3085908.html