• 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. 解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变
  • 相关阅读:
    每日一题 为了工作 2020 0330 第二十八题
    每日一题 为了工作 2020 0329 第二十七题
    每日一题 为了工作 2020 0328 第二十六题
    每日一题 为了工作 2020 0325 第二十五题
    每日一题 为了工作 2020 0326 第二十四题
    学习总结(十四)
    学习总结(十三)
    学习总结(十二)
    学习总结(十一)
    学习总结(十)
  • 原文地址:https://www.cnblogs.com/lintong/p/4369822.html
Copyright © 2020-2023  润新知