动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。
代码:
生命被代理对象所实现的接口
public interface SubjectInf { String Say(String name); }
被代理对象的具体实现:
public class SubjectImpl implements SubjectInf { @Override public String Say(String name) { // TODO Auto-generated method stub return "hello"+name; } }
public class SubjectDyanmic implements InvocationHandler { private SubjectImpl subject; public SubjectDyanmic(SubjectImpl subject) { super(); this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke run..." ); if (args == null) { method.invoke(subject, args); return null; } else { String res = (String) method.invoke(subject, args); return res; } } }
public class Client { public static void main(String[] args) { SubjectImpl sub =new SubjectImpl(); InvocationHandler handler = new SubjectDyanmic(sub); System.out.println("进入前"); //生成代理对象 SubjectInf subinf = (SubjectInf)Proxy.newProxyInstance(sub.getClass().getClassLoader() ,sub.getClass().getInterfaces(), handler); System.out.println("代理生成完毕"); /*** * 当要执行被代理对象的某个方法时会立即执行handler里面的invoke方法(反射), * 不执行被代理对象的某个方法时不会执行handler的方法 */ String res=subinf.Say("Li"); System.out.println(res); } }
</pre><pre>
程序输出:
进入前 代理生成完毕 invoke run... helloLi
如果我们测试Clinent不调用被代理对象的某个方法时 输出:
进入前 代理生成完毕 helloLi
原文地址:http://blog.csdn.net/liyantianmin/article/details/42194123