实现动态编译的功能
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();
}
}
本文深入探讨了JDK6及以上版本中使用的CompilerAPI、CGLib、ASM等技术实现动态编译的方法,并详细介绍了如何利用这些技术在AOP、插件式场景下进行代码增强与替换。通过实例展示了如何使用LogHandler类实现动态代理,进而实现实时监控代码执行过程及性能优化。
168万+

被折叠的 条评论
为什么被折叠?



