关于代理类的创建方式

<pre class="java" name="code"><pre class="java" name="code">/*代理,是什么?
手机制造总部在北京,但客户买手机不用到总部去购买,而是在本地商店就可以买到。而本地的商店就是代理。
在编写程序时,如编好了类A,经过测序符合业务需求了,但为了日后的维护,常常也需要一个,类B作为代理。如日后想在类A前后添加一些系统功能,如果直接修改类A中的代码,势必会造成严重的后果,但是如果有一个代理类B,我们把新的系统功能写好,往代理类中添加相应的系统功能即可,这样就可以避免修改源代码类A而造成的严重后果了。*/
class A{
public static void doit()
{
System.out.println("业务A被调用");
}
}
class B{
public static void doSomething()
{
//此处添加新的系统功能
A.doit();
//此处可以添加新的系统功能
}
}
<p>上面的代码只是一个简单的代理过程,但是如何获取动态的代理类呢?获取动态代理类有两种方式,</p><p>第一种:通过=Proxy.getProxyClass(
    Collection.class.g获取Proxy类的字节码,再通过该Proxy的实例化对象获取需代理类-----目标类的实例化对象,关键代码如下:</p><p>Class classProxyetClassLoader(),           //此处的参数为目标类的实现的接口的类加载器
    Collection.class                                     //此处的参数为了目标接口的字节码
    );</p><p>//获取PRoxy的构造方法,该构造方法的参数为InvocationHandler对象
  Constructor proxy=classProxy.getConstructor(InvocationHandler.class);
  //通过Proxy的构造方法获取Collection的子类即目标类的实例化对象
  Collection instance=(Collection)proxy.newInstance(new InvocationHandler(){</p><p>
 //这是目标类,可以放在这里,但这些写是写死的,不灵活,最好把它作为参数传进来,这样比较灵活,才是动态代理的思想  </p><p> Vector v=new Vector();
   @Override
   public Object invoke(Object proxy, Method method, Object[] args)
     throws Throwable {
    // TODO Auto-generated method stub
    Object retVal=method.invoke(v, args);
    return retVal;
   }
   
  });
  instance.add("bajf");
  instance.add("abnsdklyfhuwei");
  System.out.println(instance);</p><p>运行结果为:</p><p>[bajf, abnsdklyfhuwei]
</p><p>第二种:直接通过Proxy类对象获取动态代理类实例化对象</p><p>Collection collection=(Collection)Proxy.newProxyInstance(
    Collection.class.getClassLoader(),  //这里接收的是目标类的接口类的类加载器
    new Class[]{Collection.class}       //这里接收的是字节码数组
    , 
    new InvocationHandler() {           //这里接收的是InvocationHandler接口的实现类对象
      //这是目标类,可以放在这里,但这些写是写死的,不灵活,最好把它作为参数传进来,这样比较灵活,才是动态代理的思想
     ArrayList arr=new ArrayList();     
     @Override
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      // TODO Auto-generated method stub
      Object obj = method.invoke(arr, args);
      return obj;
     }
    }
    );
  collection.add("孙悟空");
  collection.add("猪八戒");
  System.out.println(collection);</p><p>运行结果为:</p><p>[孙悟空, 猪八戒]</p>


 

 

以上两种方法都可以获取动态代理,但关于目标类我都把它写死了,但为了能让广大人民群众能看懂,我应该写死。如果想要实现动态,请读者按照上面的注释自己尝试完成,做出的动态代理,其实就是一个小小的框架了,但在做动态代理的同时如遇到困难,可以跟我分享,咱一起相互学习,谢谢

 

 

 

 

 

 

 


 

发布了66 篇原创文章 · 获赞 13 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章