---------------------- android培训、java培训、期待与您交流! ----------------------
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
1、InvocationHandler 接口,该接口只提供了一个方法:Object invoke(Object proxy, Method method, Object[] args)
第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
2、Proxy类:该类即为动态代理类,提供有主要两个静态方法:
1)Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface)
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”, 用来冒充真实的对象。
2)Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类), 它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法,
invoke方法就是我们用来处理各种事情的地方 。
说明图:
例子:
1 //Dog接口 2 public interface Dog { 3 4 void run(); 5 6 }
1 //Dog实现类 2 class GunDog implements Dog { 3 4 @Override 5 public void run() { 6 System.out.println("I run fast"); 7 8 } 9 10 }
//工具类 public class DogUtil { public void method1(){ System.out.println("method1"); } public void method2(){ System.out.println("method2"); } }
1 import java.lang.reflect.InvocationHandler; 2 import java.lang.reflect.Method; 3 4 public class MyInvocationHandler implements InvocationHandler{ 5 private Object target; 6 public void setTarget(Object target){ 7 this.target = target; 8 } 9 10 @Override 11 public Object invoke(Object proxy, Method method, Object[] args) 12 throws Throwable { 13 DogUtil du = new DogUtil(); 14 du.method1(); 15 Object result = method.invoke(target, args); 16 du.method2(); 17 return result; 18 } 19 20 }
1 //代理工厂类, 2 public class ProxyFactory { 3 4 public static Object getProxy(Object target){ 5 6 MyInvocationHandler handler = new MyInvocationHandler(); 7 handler.setTarget(target); 8 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); 9 } 10 11 }
1 //测试 2 public class ProxyTest { 3 4 /** 5 * @param args 6 */ 7 public static void main(String[] args) { 8 Dog target = new GunDog(); 9 Dog dog =(Dog)ProxyFactory.getProxy(target); 10 dog.run(); 11 12 } 13 14 }
输出:
method1
I run fast
method2
总结:
1、什么是动态代理?
一种用于转发请求,进行特殊处理的机制,“动态”应该指的是“运行期”。
2、为什么使用动态代理?
可以对请求进行任何处理(如事务,日志等)
3、使用它有哪些好处?
如上
4、哪些地方需要动态代理?
不允许直接访问某些类;对访问要做特殊处理等。
---------------------- android培训、java培训、期待与您交流! ----------------------