首页 > 代码库 > Java 动态代理
Java 动态代理
动态代理是在程序动态执行时去生成的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; } }
实现一个handler
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
可见动态代理实质是分为两大块,一个是生成代理对象,再者是根据java反射去执行被代理对象的一些方法,即调用invoke方法。
Java 动态代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。