Java反射机制

来源:互联网 发布:锐捷校园网客户端mac 编辑:程序博客网 时间:2024/06/06 20:45

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

Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:

Class类:代表一个类。Field 类:代表类的成员变量(成员变量也称为类的属性)。Method类:代表类的方法。Constructor 类:代表类的构造方法。Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

接下来我会给个例子展示

public class ReflectTest {    public static void main(String[] args) throws Exception {        // 获取类        Class<Demo> c = Demo.class;        Object o = c.newInstance();        // 获取成员变量,get,set必须是同一个object,否则输出默认的11        Field idF = c.getDeclaredField("id");        idF.setAccessible(true);        idF.set(o, "110");        System.out.println(idF.get(o));        // 获取无参函数,invoke参数为o是表示同一个实例,输出之前存储的110,如果是c.newInstance()输出默认的11        Method method = c.getDeclaredMethod("printId");        method.setAccessible(true);        method.invoke(o);        // 获取有参函数        Method method1 = c.getDeclaredMethod("print", String.class);        method1.setAccessible(true);        method1.invoke(o, "hello");        Class<?>[] class1 = c.getDeclaredClasses();        for (Class<?> cls : class1) {            if (cls.getName().contains("Inner")) {                // 构造成员内部类实例                Constructor<?> con2 = cls.getDeclaredConstructor(c);                con2.setAccessible(true);                Inner inner = (Inner) con2.newInstance(o);                inner.run();            } else if (cls.getName().contains("StaticInstance")) {                // 构造静态内部类实例                StaticInstance instance = (StaticInstance) cls.newInstance();                instance.run();            }        }        // 获取匿名内部类实例(要求:已经生成对应的实例,也就是已经new过了)        Field field = c.getDeclaredField("inner2");        field.setAccessible(true);        Inner r = (Inner) field.get(o);        r.run();    }}class Demo {    private String id = "11";    private void printId() {        System.out.println(id);    }    private void print(String content) {        System.out.println(content);    }    private Inner inner;    private Inner inner2 = new Inner();    class Inner {        public void run() {            System.out.println("inner-running");        }    }    private StaticInstance staticInstance;    static class StaticInstance {        public void run() {            System.out.println("staticInstance-running");        }    }}
0 0