黑马Java学习笔记之-----动态代理

---------------------- 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培训期待与您交流! ----------------------

posted @ 2013-04-29 02:15  Mercy_K  阅读(143)  评论(0编辑  收藏  举报