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