IT序号网

Java的三种代理模式

shasha 2021年05月25日 编程语言 366 0

1.静态代理

2.JDK动态代理

Animal

1     package com.schiller; 
2  
3     public interface Animal { 
4  
5         //被代理的方法必须在实现接口中存在 
6         void run(); 
7  
8     }

Dog

 1     package com.schiller; 
 2  
 3     //目标对象一定要实现接口,否则不能用动态代理 
 4     public class Dog implements Animal { 
 5  
 6         @Override 
 7         public void run() { 
 8  
 9             System.out.println("狗用四条腿跑"); 
10  
11         } 
12     }

ProxyFactory

 1     package com.schiller; 
 2  
 3     import java.lang.reflect.InvocationHandler; 
 4     import java.lang.reflect.Method; 
 5     import java.lang.reflect.Proxy; 
 6  
 7     public class ProxyFactory{ 
 8  
 9         //维护一个目标对象 
10         private Object target; 
11  
12         public ProxyFactory(Object target){ 
13             this.target=target; 
14         } 
15  
16         //给目标对象生成代理对象 
17         public Object getProxyInstance(){ 
18  
19             //newProxyInstance是静态方法 
20             return Proxy.newProxyInstance( 
21  
22                     //第一个参数,指定当前目标对象使用类加载器,获取加载器的方法是固定的 
23                     target.getClass().getClassLoader(), 
24  
25                     //第二个参数,目标对象实现的接口的类型,使用泛型方式确认类型 
26                     target.getClass().getInterfaces(), 
27  
28                     //第三个参数,事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入 
29                     new InvocationHandler() { 
30                         @Override 
31                         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
32  
33                             //方法增强1 
34                             System.out.println("方法增强1"); 
35  
36                             //执行目标对象方法 
37                             Object returnValue = method.invoke(target, args); 
38  
39                             //方法增强2 
40                             System.out.println("方法增强2"); 
41  
42                             return returnValue; 
43                         } 
44                     } 
45             ); 
46         } 
47     }

Test

 1     package com.schiller; 
 2  
 3     public class Test { 
 4         public static void main(String[] args){ 
 5  
 6             //将目标对象向上转型 
 7             Animal dog = new Dog(); 
 8  
 9             //给目标对象,创建代理对象,代理对象也是上转类型 
10             Animal dogProxy = (Animal)new ProxyFactory(dog).getProxyInstance(); 
11  
12             //执行代理方法 
13             dogProxy.run(); 
14  
15         } 
16     }

3.cglib动态代理


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!