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