实现动态编译的功能
JDK6即以上版本:Compiler API
Open Source
CGLib会使用到继承,然后生成二进制文件
ASM会直接生成二进制文件
Spring用到的是CGlib的方案
使用动态代理的业务场景:
AOP:aspect oriented programming面相切面编程
插件式的:叠加,替换,插拔,不影响原始代码
package lohamce.proxy;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + " starting...");
long start = System.currentTimeMillis();
Object obj = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println("Time cost = " + (end - start));
System.out.println(method.getName() + " end.");
return obj;
}
}
package lohamce.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client2 {
public static void main(String[] args) {
Movable p = new Person();
InvocationHandler h = new LogHandler(p);
p = (Movable)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), p.getClass().getInterfaces(), h);
p.move();
}
}