cglib
代理5 cglib 概述
https://www.jianshu.com/p/27484d2c47d3
代理6 cglib KeyFactory
https://www.jianshu.com/p/75e328787680
/**
* 类说明
* System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");
--该设置用于输出cglib动态代理产生的类
* System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
--该设置用于输出jdk动态代理产生的类
*
* @author hanwen.mei@msxf.com
* @version CglibTest1.java, 2019/11/30 16:13
*/
public class CglibTest1 {
@Test
public void testFixedValue() throws Exception {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\work\\gitlab\\cloud\\aoptest\\classout");
System.out.println("start ====================== ");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SampleClass.class);
enhancer.setCallback(new FixedValue() {
@Override
public Object loadObject() throws Exception {
return "Hello cglib!";
}
});
SampleClass proxy = (SampleClass) enhancer.create();
assertEquals("Hello cglib!", proxy.test(null));
}
}
public class SampleClass {
public String test(String input) {
System.out.println("Sample class test() invoke");
return "Hello world!";
}public String hahah(String input) {
System.out.println("Sample class hahah() invoke");
test("aa");
return "hahah!";
}
}public class EnhancerSampleClass extends SampleClass {@Override
public String test(String input) {
System.out.println("enhance test method!!!");
// methodProxy.invoke -> origintest
return origintest(input);
}@Override
public String hahah(String input) {
System.out.println("enhance hahah method!!!");
return originhahah(input);
}public String origintest(String input) {
return super.test(input);
}public String originhahah(String input) {
return super.hahah(input);
}public static void main(String[] args) {
SampleClass enhancerSampleClass = new EnhancerSampleClass();
enhancerSampleClass.hahah("aa");
}
} private static class FastClassInfo
{
FastClass f1;
// net.sf.cglib.test.Target的fastclass
FastClass f2;
// Target$$EnhancerByCGLIB$$788444a0 的fastclass
int i1;
//方法g在f1中的索引
int i2;
//方法CGLIB$g$0在f2中的索引
}
cglib和aop的重要区别
cglib:是根据方法建立索引来快速调用到target对象的原始方法。通过FastClassInfo,建立的过程可能比较耗时,但是建立好之后访问比较快。
https://www.cnblogs.com/cruze/p/3865180.html
【cglib】JDK Proxy:是使用反射来调用target对象的原始方法,性能不如cglib,但是生成的速度比cglib快。
推荐阅读
- 事件代理
- 设计模式-代理模式-Proxy
- java静态代理模式
- Kotlin基础(10)-代理模式在kotlin中的使用
- Nginx进阶(1)——nginx本地代理配置访问node服务
- 怎么选择一家靠谱的财务代理公司()
- java动态代理技术解析
- cmd设置代理命令
- nginx反向代理命令
- X2-7-代理模式