反射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 | 
类代理 |