首页 / JAVA / java 动态代理(类型信息)
java 动态代理(类型信息)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java 动态代理(类型信息),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3791字,纯文字阅读大概需要6分钟。
内容图文
代理是基本的设计模式之一它为你提供额外的或不同的操作,而插入的用来代替"实际"对象的对象.
package typeinfo; // : typeinfo/SimpleProxyDemo.java import static net.mindview.util.Print.*; interface Interface { void doSomething(); void somethingElse(String arg); } class RealObject implements Interface { publicvoid doSomething() { print("doSomething"); } publicvoid somethingElse(String arg) { print("somethingElse " + arg); } } class SimpleProxy implements Interface { private Interface proxied; public SimpleProxy(Interface proxied) { this.proxied = proxied; } publicvoid doSomething() { print("SimpleProxy doSomething"); proxied.doSomething(); } publicvoid somethingElse(String arg) { print("SimpleProxy somethingElse " + arg); proxied.somethingElse(arg); } } class SimpleProxyDemo { publicstaticvoid consumer(Interface iface) { iface.doSomething(); iface.somethingElse("bonobo"); } publicstaticvoid main(String[] args) { consumer(new RealObject()); consumer(new SimpleProxy(new RealObject())); } } /* Output: doSomething somethingElse bonobo SimpleProxy doSomething doSomething SimpleProxy somethingElse bonobo somethingElse bonobo *///:~
动态代理的思想更向前迈进了一步,因为它可以动态地创建代理并动态地处理对所代理方法的调用.
package typeinfo; // : typeinfo/SimpleDynamicProxy.java import java.lang.reflect.*; class DynamicProxyHandler implements InvocationHandler { private Object proxied; public DynamicProxyHandler(Object proxied) { this.proxied = proxied; } 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(proxied, args); } } class SimpleDynamicProxy { publicstaticvoid consumer(Interface iface) { iface.doSomething(); iface.somethingElse("bonobo"); } publicstaticvoid main(String[] args) { RealObject real = new RealObject(); consumer(real); // Insert a proxy and call again: Interface proxy = (Interface)Proxy.newProxyInstance( Interface.class.getClassLoader(), new Class[]{ Interface.class }, new DynamicProxyHandler(real)); consumer(proxy); } } /* Output: (95% match) doSomething somethingElse bonobo **** proxy: class $Proxy0, method: public abstract void Interface.doSomething(), args: null doSomething **** proxy: class $Proxy0, method: public abstract void Interface.somethingElse(java.lang.String), args: [Ljava.lang.Object;@42e816 bonobo somethingElse bonobo *///:~
package typeinfo; // : typeinfo/SelectingMethods.java // Looking for particular methods in a dynamic proxy. import java.lang.reflect.*; importstatic net.mindview.util.Print.*; class MethodSelector implements InvocationHandler { private Object proxied; public MethodSelector(Object proxied) { this.proxied = proxied; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("interesting")) print("Proxy detected the interesting method"); return method.invoke(proxied, args); } } interface SomeMethods { void boring1(); void boring2(); void interesting(String arg); void boring3(); } class Implementation implements SomeMethods { publicvoid boring1() { print("boring1"); } publicvoid boring2() { print("boring2"); } publicvoid interesting(String arg) { print("interesting " + arg); } publicvoid boring3() { print("boring3"); } } class SelectingMethods { publicstaticvoid main(String[] args) { SomeMethods proxy= (SomeMethods)Proxy.newProxyInstance( SomeMethods.class.getClassLoader(), new Class[]{ SomeMethods.class }, new MethodSelector(new Implementation())); proxy.boring1(); proxy.boring2(); proxy.interesting("bonobo"); proxy.boring3(); } } /* Output: boring1 boring2 Proxy detected the interesting method interesting bonobo boring3 *///:~
原文:https://www.cnblogs.com/jiangfeilong/p/10355694.html
内容总结
以上是互联网集市为您收集整理的java 动态代理(类型信息)全部内容,希望文章能够帮你解决java 动态代理(类型信息)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。