1.静态代理

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄