动态代理JDK
public interface A {
void p(Integer a);
}
public class B implements A{
@Override
public void p(Integer a) {
System.out.println("B:" + a);
}
}
public class JdkAgent {
private Object target;
public JdkAgent(Object object) {
this.target = object;
}
public Object getProxy() {
ClassLoader classLoader = target.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Runtime r = Runtime.getRuntime();
r.gc();
long start = System.currentTimeMillis();
long startMem = r.freeMemory();
Object invoke = method.invoke(target, args);
long endMem = r.freeMemory();
long end = System.currentTimeMillis();
System.out.println("TimeCost: " + (end - start) + "ms");
System.out.println("MemoryCost: " + (startMem - endMem) / 1024 + "KB");
return invoke;
}
});
}
}
public static void main(String[] args) {
B b = new B();
JdkAgent jdkAgent = new JdkAgent(b);
A proxy = (A) jdkAgent.getProxy();
proxy.p(3);
}
输出:
B:3
TimeCost: 20ms
MemoryCost: 573KB
动态代理cglib(基于子类)
需要的jar
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
public class CgLib implements MethodInterceptor{
private Object target;
public CgLib(Object object) {
this.target = object;
}
public Object getProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cgLbv:");
return methodProxy.invoke(target, objects);
}
}
public static void main(String[] args) {
B b = new B();
CgLib cgLib = new CgLib(b);
B proxy = (B) cgLib.getProxy();
proxy.p(3);
}
输出:
cgLbv:
B:3