[Java] Java反射的使用

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

1 使用Java反射获取类的信息

Java使用Class类的实例来表示一个Java类的信息。其中不同数据类型的类均可以由Class表示。jdk文档对Class解释如下:

Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects. [1]

使用Class可以得到一个类的信息,例如:

 void printClassName(Object obj) {
         System.out.println("The class of " + obj +
                            " is " + obj.getClass().getName());
     }

上述代码调用了一个实例的getClass()方法,获得了对应的Class实例,然后调用它的getName()方法来获得类名。
出了JVM自动的管理类的加载和删除,可以使用如下方法获取Class实例:

  • Class classType = Class.forName("类全名");
  • Class classType = XXX.class;

2 使用Java反射创建实例

有了Class实例后,可以使用如下方法创建该类对应的实例:
1. Object obj = classType.newInstance();
2. 使用getConstructor()获得类的构造函数,然后调用构造函数的newInstance()方法创建类的实例:

   Constructor<类名> con = classType.getConstructor(String.class,
                int.class); 
        Object obj = con.newInstance("xxx", 123);

3 使用Java反射修改实例中的属性值

使用getMethod()方法获取类的方法,然后使用获得的方法类型的invoke(),调用此方法,见如下实例:

        Person p = new Person();
        Class classType = Person.class;
        //getMethod()获取public方法
        Method method = classType.getMethod("setName", String.class);  
        method.invoke(p, "ckl");
        //getDeclareMethod()获取所有声明的方法
        Method method2 = classType.getDeclaredMethod("test");  
        method2.setAccessible(true);
        method2.invoke(p);

详细解释见api文档。

4 使用Java反射调用实例中的方法

使用getField()或者getDeclaredField方法来获取类中声明的变量,然后使用set()方法来设置其中的值:

        Person p = new Person();  
        Class classType = Person.class;  
        Field field = classType.getDeclaredField("name");  
        Field field2 = classType.getDeclaredField("age");  
        field.setAccessible(true);  
        field2.setAccessible(true);  
        field.set(p, "xxx");  
        field2.set(p, 123);  

参考文献:

[1] java api 文档

你可能感兴趣的:(转载积累,Java,EE,java,反射)