转!!java三种代理模式
转自:https://blog.csdn.net/weixin_42255981/article/details/103527327?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-103527327-blog-109050274.pc_relevant_multi_platform_featuressortv2dupreplace&spm=1001.2101.3001.4242.2&utm_relevant_index=4
java三种代理模式:不改变源码的情况下,实现对目标对象的功能扩展
package com.cmcc.core.domain.vo; //接口 public interface Isinger { void sing(); void call(); }
package com.cmcc.core.domain.vo; //实现类,目标对象 public class Singer implements Isinger{ @Override public void sing() { System.out.println("sing a song"); } @Override public void call() { System.out.println("call"); } }
1)静态代理
package com.cmcc.core.domain.vo; //代理对象-java静态代理 public class StaticProxy implements Isinger{ private Isinger isinger; public StaticProxy(Isinger isinger){ this.isinger=isinger; } @Override public void sing() { System.out.println("问好"); isinger.sing(); System.out.println("谢谢"); } @Override public void call() { System.out.println("call before"); isinger.call(); System.out.println("call after"); } public static void main(String[] args) { Isinger iSinger = new Singer(); StaticProxy proxy = new StaticProxy(iSinger); proxy.sing(); } }
2)JDK动态代理
利用java自带的反射包
package com.cmcc.core.domain.vo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //代理对象-JDK动态代理 public class JdkDynamicProxy implements InvocationHandler { private Isinger target; public JdkDynamicProxy(Isinger target) { this.target = target; } public <T> T getInstance(){ return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置增强"); return method.invoke(target); } public static void main(String[] args) { // JdkDynamicProxy dp=new JdkDynamicProxy(new Singer()); // ((Isinger) dp.getInstance()).sing(); Singer target = new Singer(); Isinger proxy = (Isinger) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { System.out.println("向观众问好"); Object returnValue = method.invoke(target, args); System.out.println("谢谢大家"); return returnValue; } }); proxy.sing(); } }
3)CGLIB动态代理
利用cglib的jar包,可用Spring的核心包中自带的Cglib功能(spring-core-3.2.5.jar)
package com.cmcc.core.domain.vo; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Cglib子类代理工厂 */ public class CglibProxy implements MethodInterceptor { private Isinger target; public CglibProxy(Isinger target){ this.target=target; } // 给目标对象创建一个代理对象 public Object getProxyInstance(){ //1.工具类 Enhancer en = new Enhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback(this); //4.创建子类(代理对象) return en.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // if (method.getName().equals("call")) { // System.out.println("喊叫之前"); // }else { // System.out.println("向观众问好"); // } //执行目标对象的方法 Object returnValue = method.invoke(target, args); System.out.println("谢谢大家"); return returnValue; } public static void main(String[] args){ //目标对象 Singer target = new Singer(); //代理对象 Singer proxy = (Singer)new CglibProxy(target).getProxyInstance(); //执行代理对象的方法 proxy.sing(); proxy.call(); } }
代理工厂-工具类方式:
package com.cmcc.core.domain.vo; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.proxy.Enhancer; //工厂类 public class CglibProxyFactory { // 维护目标对象 public Object target; public CglibProxyFactory(Isinger target) { this.target = target; } // 给目标对象创建一个代理对象 public Object getProxyInstance() { //1.工具类 Enhancer en = new Enhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback((Callback) this); //4.创建子类(代理对象) return en.create(); } }
package com.cmcc.core.domain.vo; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; //代理对象 继承 工厂类 public class SingerProxy extends CglibProxyFactory implements MethodInterceptor { public SingerProxy(Isinger target) { super(target); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("向观众问好"); Object returnValue = method.invoke(target, objects); System.out.println("谢谢大家"); return returnValue; } public static void main(String[] args) { Singer singer = new Singer(); Singer proxy = (Singer)new SingerProxy(singer).getProxyInstance(); proxy.sing(); } }
标签:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-09-26 原!mysql存储过程 批量导入数据