跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

反射API

classDiagram
    class Class {
        +Field[] getFields()
        +Method[] getMethods()
        +Constructor[] getConstructors()
    }

    class Field {
        +Object get(Object obj)
        +void set(Object obj, Object value)
    }

    class Method {
        +Object invoke(Object obj, Object... args)
    }

    class Constructor {
        +Object newInstance(Object... args)
    }

动态代理深入

// 1. JDK动态代理
interface Service {
    void serve();
}

class ProxyHandler implements InvocationHandler {
    private Object target;

    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("前置处理");
        Object result = method.invoke(target, args);
        System.out.println("后置处理");
        return result;
    }
}

// 2. CGLIB动态代理
class CglibProxy implements MethodInterceptor {
    public Object getProxy(Class<?> clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) {
        System.out.println("前置处理");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("后置处理");
        return result;
    }
}

方法句柄(MethodHandle)

// 获取方法句柄
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType type = MethodType.methodType(String.class, int.class, int.class);
MethodHandle mh = lookup.findVirtual(String.class, "substring", type);

// 调用方法
String result = (String) mh.invokeExact("Hello World", 0, 5);

性能对比

方式 执行时间(ns) 适用场景
直接调用 5 常规调用
反射调用 500 框架扩展
方法句柄 50 高性能反射需求
JDK动态代理 800 接口代理
CGLIB动态代理 1000 类代理