Java反射机制

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");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值