Java的三种代理模式
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动态代理

更多精彩