Java反射——实现动态代理
1.Java静态代理举例:
代理类和被代理类在编译期间就已经确定下来了
1 interface ClothFactory{ 2 void produceCloth(); 3 } 4 5 class ProxyClothFactory implements ClothFactory{ 6 private ClothFactory factory; 7 public ProxyClothFactory(ClothFactory factory) { 8 this.factory = factory; 9 } 10 11 public void produceCloth() { 12 System.out.println("准备一些工作"); 13 factory.produceCloth(); 14 System.out.println("准备一些后续工作"); 15 } 16 } 17 18 class NikeClothFactory implements ClothFactory{ 19 @Override 20 public void produceCloth() { 21 System.out.println("Nike工厂生产一批衣服"); 22 } 23 } 24 25 public class StaticProxyTest { 26 public static void main(String[] args) { 27 //创建被代理类对象 28 NikeClothFactory nike = new NikeClothFactory(); 29 //创建代理类对象 30 ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike); 31 proxyClothFactory.produceCloth(); 32 } 33 }
2.Java动态代理举例:
1 interface Human{ 2 String getBelief(); 3 void eat(String food); 4 } 5 6 //被代理类 7 class SuperMan implements Human{ 8 9 @Override 10 public String getBelief() { 11 return "I believe I can fly!"; 12 } 13 14 @Override 15 public void eat(String food) { 16 System.out.println("我喜欢吃" + food); 17 } 18 } 19 /* 20 要想生成动态代理,需要解决的问题 21 问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象 22 问题二:当通过代理类的对象去调用方法时,如何动态的去调用代理类中的同名方法 23 */ 24 25 class ProxyFactory { 26 //调用此方法,返回一个代理类对象,解决问题1 27 public static Object getProxyInstance(Object obj) {//obj:被代理类的对象 28 MyInvocationHandler handler = new MyInvocationHandler(); 29 handler.bind(obj); 30 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler); 31 } 32 } 33 34 class MyInvocationHandler implements InvocationHandler { 35 private Object obj;//需要使用被代理类的对象进行赋值 36 37 public void bind(Object obj) { 38 this.obj = obj; 39 } 40 41 //当通过代理类的对象调用方法a时,就会自动调用如下方法:invoke() 42 //将被代理类要执行的方法a的功能就声明在invoke()中 43 @Override 44 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 45 //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法 46 //obj:被代理类的对象 47 Object returnValue = method.invoke(obj, args); 48 //上述方法返回值就做为当前invoke()的返回值 49 return returnValue; 50 } 51 } 52 53 public class ProxyTest { 54 public static void main(String[] args) { 55 SuperMan superMan = new SuperMan(); 56 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); 57 String belief = proxyInstance.getBelief(); 58 System.out.println(belief); 59 proxyInstance.eat("麻辣香锅"); 60 61 NikeClothFactory nikeClothFactory = new NikeClothFactory(); 62 ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory); 63 proxyClothFactory.produceCloth(); 64 } 65 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧