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 }
复制代码

 

posted @   jue1e0  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示