Java的三种代理模式

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动态代理

posted @ 2019-04-07 22:03  Schiller_Hu  阅读(748)  评论(0编辑  收藏  举报