java的动态代理

本文转载自:http://www.zhihu.com/question/20794107
先来看静态代理模式代码:

 1 package test;
 2 
 3 public interface Subject   
 4 {   
 5   public void doSomething();   
 6 }
 7 
 8 public class RealSubject implements Subject   
 9 {   
10   public void doSomething()   
11   {   
12     System.out.println( "call doSomething()" );   
13   }   
14 }  
15 
16 public class SubjectProxy implements Subject
17 {
18   Subject subimpl = new RealSubject();
19   public void doSomething()
20   {
21      subimpl.doSomething();
22   }
23 }
24 
25 
26 public class TestProxy 
27 {
28    public static void main(String args[])
29    {
30        Subject sub = new SubjectProxy();
31        sub.doSomething();
32    }
33 }

刚开始我会觉得SubjectProxy定义出来纯属多余,直接实例化实现类完成操作不就结了吗?后来随着业务庞大,你就会知道,实现proxy类对真实类的封装对于粒度的控制有着重要的意义。但是静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。所以引入动态代理来解决此类问题。

先看代码:

 1 package test;
 2 
 3 public interface Subject   
 4 {   
 5   public void doSomething();   
 6 }
 7 
 8 
 9 public class RealSubject implements Subject   
10 {   
11   public void doSomething()   
12   {   
13     System.out.println( "call doSomething()" );   
14   }   
15 }  
16 
17 
18 import java.lang.reflect.InvocationHandler;  
19 import java.lang.reflect.Method;  
20 import java.lang.reflect.Proxy;  
21 
22 public class ProxyHandler implements InvocationHandler
23 {
24     private Object tar;
25 
26     //绑定委托对象,并返回代理类
27     public Object bind(Object tar)
28     {
29         this.tar = tar;
30         //绑定该类实现的所有接口,取得代理类 
31         return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
32                                       tar.getClass().getInterfaces(),
33                                       this);
34     }    
35 
36     public Object invoke(Object proxy , Method method , Object[] args)throws Throwable
37     {
38         Object result = null;
39         //这里就可以进行所谓的AOP编程了
40         //在调用具体函数方法前,执行功能处理
41         result = method.invoke(tar,args);
42         //在调用具体函数方法后,执行功能处理
43         return result;
44     }
45 }
46 
47 
48 public class TestProxy
49 {
50     public static void main(String args[])
51     {
52            ProxyHandler proxy = new ProxyHandler();
53            //绑定该类实现的所有接口
54            Subject sub = (Subject) proxy.bind(new RealSubject());
55            sub.doSomething();
56     }
57 }


看完代码,现在我来回答,动态代理的作用是什么:

  1. Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;
  2. 可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;
  3. 解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变
原文地址:https://www.cnblogs.com/lintong/p/4369822.html