/** * 2014-4-19 * 动态代理比代理的思想更进一步,可以动态地创建代理,并且可以动态地调用被代理的方法。 * */ package typeinfo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 定义出代理对象的接口 * @author LYL * */ interface Interface{ void doSomething(); void somethingElse(String arg); } /** * 被代理的对象,是真正干活的 * @author LYL * */ class RealObject implements Interface{ @Override public void doSomething() { System.out.println("RealObject doSomething"); } @Override public void somethingElse(String arg) { System.out.println("RealObject somethingElse"+arg); } } /** * 定义代理类调用被代理类的方法时的逻辑 * @author LYL * */ class ProxyHandler implements InvocationHandler { //被代理对象 private Interface proxied; public ProxyHandler(Interface proxied){ this.proxied=proxied; } /** * 调用处理器,当动态代理进行方法调用时,将使用该处理器。 * 可以在该方法中对指定的方法进行定制,特殊处理。 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Proxy:"+proxy.getClass()+", method:"+method+" , args:"+args); //显示参数 if(args!=null){ for(Object arg:args){ System.out.println(" "+arg); } } //调用被代理类的方法 return method.invoke(this.proxied, args); } } /** * 通过使用java.lang.reflect.Proxy创建动态代理的实例 * @author LYL * */ public class SimpleDynamicProxy{ public static void consumer(Interface iface){ iface.doSomething(); iface.somethingElse(" invoke "); } public static void main(String args[]) throws Exception{ RealObject real=new RealObject(); //对象的一般调用 consumer(real); //创建一个动态代理 Interface iface=(Interface)Proxy.newProxyInstance( //类加载器, Interface.class.getClassLoader(), //代理类实现的接口或基类数组 new Class[]{Interface.class}, //代理处理器 new ProxyHandler(new RealObject())); System.out.println("通过动态代理生成的代理类实例"); //通过生成的动态代理来执行功能 consumer(iface); } }