首页 > 其他分享 >使用CGLIB生成代理

使用CGLIB生成代理

时间:2023-04-27 22:03:30浏览次数:39  
标签:enhancer personDao name PersonServerCGLIB Object 代理 生成 CGLIB public


知识点

【 


使用前提条件: 


 【 

 /* 

 * 如果这个代理的类没有实现接口就不能使用JDK中的动态代理 

 * 这时需要使用第三方的.jar CGLIB实现代理 

 * 

 */ 

 】 


public class CGLIBProxy implements MethodInterceptor { 

 private Object targetObject;//代理的目标对象 

 public Object createProxyInstance(Object targetObject){ 

 this.targetObject = targetObject; 

 Enhancer enhancer = new Enhancer();//该类用于生成代理对象 

 enhancer.setSuperclass(this.targetObject.getClass());//设置父类 

 enhancer.setCallback(this);//设置回调用对象为本身 

 return enhancer.create(); 

 } 

 public Object intercept(Object proxy, Method method, Object[] args, 

 MethodProxy methodProxy) throws Throwable { 

 return methodProxy.invoke(this.targetObject, args); 

 } 

} 

CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。 



】 


实现步骤: 


第一步:在spring解压包中找到cglib-nodep-2.1_3.jar文件并导入 


第四步:编写PersonServerCGLIB类 

public class PersonServerCGLIB { 

 private IPersonDao personDao; 

 private String name; 


 public PersonServerCGLIB(){} 


 /* 

 * 通过构造器来注入依赖对象 

 */ 

 public PersonServerCGLIB(IPersonDao personDao, String name) { 


 this.name = name; 

 this.personDao = personDao; 


 } 

 public PersonServerCGLIB(String name){ 

 this.name=name; 

 } 


 public String getName() { 

 return name; 

 } 


 public void setName(String name) { 

 this.name = name; 

 } 

 public IPersonDao getPersonDao() { 

 return personDao; 

 } 


 // @Resource(name="mypersonDao") 

 // @Autowired 

 public void setPersonDao(IPersonDao personDao) { 

 this.personDao = personDao; 

 } 

 public void save() { 


 System.out.println("Test CGLIB Proxy"); 

 } 

} 



第三步:编写CGLIB代理类 


public class createCGLIBProxy implements MethodInterceptor{ 

 /* 

 * 如果这个代理的类没有实现接口就不能使用JDK中的动态代理 

 * 这时需要使用第三方的.jar CGLIB实现代理 

 * 

 */ 

 private Object targeObject; 


 public Object createCGLIBProxy(Object targeObject) 

 { 

 this.targeObject=targeObject; 

 Enhancer enhancer=new Enhancer(); 

 //设置父类 这里代理类需要继承这个父类 和JDK实现类似 

 enhancer.setSuperclass(this.targeObject.getClass()); 

 enhancer.setCallback(this); 


 return enhancer.create(); 

 } 


 public Object intercept(Object object, Method method, Object[] arg2, 

 MethodProxy methodProxy) throws Throwable { 


 Object object1=null; 


 PersonServerCGLIB personServer=(PersonServerCGLIB)this.targeObject; 

 if(personServer.getName()!=null || "".equals(personServer.getName())) 

 { 

 object1=methodProxy.invoke(this.targeObject, arg2); 

 } 


 return object1; 

 } 

} 


第四步 :编写单元测 


@Test 

public void TestCGLIBProxy() 

{ 

createCGLIBProxy proxy=new createCGLIBProxy(); 

 //PersonServer personServer=(PersonServer)proxy.createProxyInstance(new PersonServer("liyong")); 


//这里转换为代理类而不是接口原因是这个类没有实现任何接口 


 PersonServerCGLIB personServer=(PersonServerCGLIB)proxy.createCGLIBProxy(new PersonServerCGLIB("liyong")); 

 personServer.save(); 

}

标签:enhancer,personDao,name,PersonServerCGLIB,Object,代理,生成,CGLIB,public
From: https://blog.51cto.com/u_16091571/6232146

相关文章

  • JDK动态代理
    知识点【publicclassJDKProxyimplementsInvocationHandler{privateObjecttargetObject;//代理的目标对象publicObjectcreateProxyInstance(ObjecttargetObject){this.targetObject=targetObject;/**第一个参数设置代码使......
  • 在线设计Tkinter界面,生成Python代码,Tkinter布局助手,拖拽生成界面,tkinter designer,可视
    设计地址:https://www.pytk.net/tkinter-helper/? 运行演示  教程地址:https://www.pytk.net/tkinter.html 常用演示"""本代码由[Tkinter布局助手]生成当前版本:3.2.4官网:https://www.pytk.net/tkinter-helperQQ交流群:788392508"""fromtkinterimportmessag......
  • c# winform 用代码生成一张只有一个像素点的图片,保存到硬盘里或者显示到panel里...
    只生成图片stringnullPath="C:\\黑色头发.jpg";Bitmapb=newBitmap(1,1);b.Save(nullPath);b.Dispose();生成图片并显示到panel里Bitmapb=newBitmap(this.panel1.Width,this.panel1.Height);this.panel1.DrawToBitmap(b,newRectangle(0......
  • electron 配置mac安装的图标, 生成.icns文件
    electron配置mac安装的图标使用的icon.icns准备一张1024*1024的png图片1.在项目根目录中创建文件()mkdirtmp.iconset2.生成多个比例不同的图片sips-z1616logo.png--outtmp.iconset/icon_16x16.pngsips-z3232logo.png--outtmp.iconset/icon_16x16@2x......
  • nginx 正则反向代理到k8s
    代码:nginx正则反向代理到k8s的服务:http{resolverkube-dns.kube-system.svc.cluster.local;server{listen80;#serviceslocation~/(\w+)/{ proxy_passhttp://$1.default.svc.cluster.local:8888;}}配置:  ......
  • ASEMI代理ADI亚德诺ADM3051CRZ-REEL7车规级芯片
    编辑-ZADM3051CRZ-REEL7芯片参数:型号:ADM3051CRZ-REEL7显性状态:78mA隐性状态:10mA待命状态:275μACANH输出电压:4.5VCANL输出电压:2V差动输出电压:3V输入电压滞后:150mV差分输入电阻:100kΩ参考输出电压:3.025V最大数据速率:1MbpsVCC:−0.3Vto+7V工作温度范围:−40°C......
  • ASEMI代理ADI亚德诺ADM2582EBRWZ工业级隔离式收发器
    编辑-ZADM2582EBRWZ是ADI推出的一款带隔离的RS-485/RS-422收发器芯片,采用专利的iCoupler隔离技术,可以提供高达2.5kV的隔离电压,具有超高带宽和低功耗等优势,适用于工业自动化、仪器仪表、通信设备等领域。 一、iCoupler隔离技术 ADM2582EBRWZ采用了ADI专利的iCoupler隔离技术......
  • highchart 生成一个3d的柱状图
    highchart生成一个光秃秃的柱状图Highcharts.chart('container',{chart:{type:'column',margin:0,options3d:{enabled:true,alpha:15,//控制x轴角度beta:15,//控制y轴角度depth:50,//柱子深度viewDistance......
  • burp suite手动代理设置
    一直点击下一步就可以了接着我们打开Windows设置,设置代理:  一定要点击保存!......
  • Vue项目的网络请求代理到封装详细步骤
    1.创建vue项目vuecreatedemodemo是项目名称2.安装axios 进入demo里面打开终端(黑窗口),执行npminstallaxios3.进行config.js配置devServer:{host:"0.0.0.0",//是否可以被覆盖port:8090,//配置本地端口号open:true,//解决跨域问题......