动态代理

本文介绍了一个使用Java动态代理实现的具体示例。通过自定义Subject接口和真实主题类RealSubject,文章展示了如何创建InvocationHandler并利用Java反射API生成动态代理类。最终通过执行测试类Client验证了动态代理的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义2个接口subject1,subject2

 1 package proxy;
 2 
 3 public interface Subject1 {
 4     public void doSomething();
 5 }
 6 
 7 
 8 
 9 package proxy;
10 
11 public interface Subject2 {
12     public void doOtherthing();
13 }

 

定义2个真实的RealSubject1(implements subject1),RealSubject2(implements subject1,subject2)

 1 package proxy;
 2 
 3 public class RealSubject1 implements Subject1 {
 4 
 5     @Override
 6     public void doSomething() {
 7         // TODO Auto-generated method stub
 8         System.out.println("realSubject1 invoke from Subject1");
 9     }
10 
11 }
12 
13 package proxy;
14 
15 public class RealSubject2 implements Subject2,Subject1{
16 
17     @Override
18     public void doOtherthing() {
19         System.out.println("realSubject2 invoke from Subject2");
20         
21     }
22     @Override
23     public void doSomething() {
24         System.out.println("realSubject2 invoke from Subject1");
25 
26     }
27 
28 }

 

创建一个invocationHandler

 1 package proxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 public class DynanicSubject implements InvocationHandler {
 7     private Object o1;
 8     public DynanicSubject(Object obj){
 9         this.o1=obj;
10     }
11     @Override
12     public Object invoke(Object proxy, Method method, Object[] args)
13             throws Throwable {
14         System.out.println("执行前");
15         method.invoke(o1, args);
16         System.out.println("执行后");
17         return null;
18     }
19 
20 }

创建测试类

 

 1 package proxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Proxy;
 5 
 6 public class Client {
 7     public static void main(String[] args) {
 8                //分别创建真实类对象以及handler
 9         Subject1 sub1=new RealSubject1();
10         RealSubject2 sub2=new RealSubject2();
11                  
12         InvocationHandler hander=new DynanicSubject(sub1);
13         InvocationHandler hander2=new DynanicSubject(sub2);
14                  //创建动态代理类 (由于RealSubject2实现2个接口,因此下面进行2此转换,分别调用2个方法)
15         Subject1 su=(Subject1)Proxy.newProxyInstance(hander.getClass().getClassLoader(), sub1.getClass().getInterfaces(), hander);
16         Subject2 su2=(Subject2)Proxy.newProxyInstance(hander2.getClass().getClassLoader(), sub2.getClass().getInterfaces(), hander2);
17         su.doSomething();
18         su2.doOtherthing();
19         Subject1 su3=(Subject1)Proxy.newProxyInstance(hander2.getClass().getClassLoader(), sub2.getClass().getInterfaces(), hander2);
20         su3.doSomething();
21     }
22 }  

 

执行结果:

执行前
realSubject1 invoke from Subject1
执行后
执行前
realSubject2 invoke from Subject2
执行后
执行前
realSubject2 invoke from Subject1
执行后

转载于:https://www.cnblogs.com/oldcownotGiveup/p/5366323.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值