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