动态代理简单来说就是当我们想调用某个对象的方法时,通常是通过对象直接调用对象自己的方法,然而有时我们并不能直接拿到给对象,而是只能拿到一个“代理”对象,通过代理对象去代理真实对象,调用真实对象的方法。那么问题来了,为什么不能直接拿到对象?代理对象代理真实对象又有写什么用呢?其实之所以用代理对象去代理(代处理)真实对象,就是想在真实对象调用方法前后做一些处理。java已经实现了动态代理,通过java.lang.reflect.InvocationHandler、java.lang.reflect.Method和java.lang.reflect.Proxy三个类实现。
package com.liujun.dynamicProxy; /** * 一个普通的接口 * @author asus * */ public interface StudentI { public void doing(); }
package com.liujun.dynamicProxy; /** * 普通对象的实现类 * @author asus * */ public class RealStudent implements StudentI { @Override public void doing() { System.out.println("我是一个学生"); } }
package com.liujun.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 代理调用处理器 * @author asus * */ public class ProxyHandler implements InvocationHandler { //要代理的真实对象 private Object realObject; public ProxyHandler(Object realObject) { this.realObject=realObject; } @Override public Object invoke(Object object, Method method, Object[] arg) throws Throwable { Object result; //方法调用前 beforeDoing(); //调用真实对象的方法 result=method.invoke(this.realObject, arg);//调度方法的结果代表该对象obj的参数arg //方法调用后 afterDoing(); return result; } /** * 代理对象方法调用前调用该方法 */ private void beforeDoing(){ System.out.println("beforeDoing()"); } /** * 代理对象方法调用后调用该方法 */ private void afterDoing(){ System.out.println("afterDoing()"); } }
package com.liujun.test; import java.lang.reflect.Proxy; import com.liujun.dynamicProxy.ProxyHandler; import com.liujun.dynamicProxy.RealStudent; import com.liujun.dynamicProxy.StudentI; public class DynamicProxyTest { public static void main(String[] args) { //真实对象 StudentI student=new RealStudent(); //代理处理器 ProxyHandler proxyHandler=new ProxyHandler(student); //通过代理处理器生成代理对象 StudentI proxyStuent=(StudentI) Proxy.newProxyInstance(student.getClass().getClassLoader(), student.getClass().getInterfaces(), proxyHandler); //代理对象代理调用真实对象的方法 proxyStuent.doing(); } }
原文地址:http://blog.csdn.net/u010739551/article/details/43648723