详解Java动态代理的实现及应用
程序员文章站
2024-02-27 22:33:57
详解java动态代理的实现及应用
java动态代理其实写日常业务代码是不常用的,但在框架层一起rpc框架的客户端是非常常见及重要的。spring的核心思想aop的底层原理...
详解java动态代理的实现及应用
java动态代理其实写日常业务代码是不常用的,但在框架层一起rpc框架的客户端是非常常见及重要的。spring的核心思想aop的底层原理实现就使用到了java的动态代理技术。
使用代理可以实现对象的远程调用以及aop的实现。
java的动态代理的实现,主要依赖invoctionhandler(接口)和proxy(类)这两个。
下面是一个例子
实现的代理的一般需要有个接口
package com.yasin.proxylearn; public interface istudy { public void learn(); public string getkonwledge(); }
该接口的实现的类
package com.yasin.proxylearn; public class study implements istudy{ public void learn() { system.out.println("我要开始学习了!"); } public string getkonwledge() { return "java真的强"; } }
代理类,该类需要实现invacationhandler接口
package com.yasin.proxylearn; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; public class studyproxy implements invocationhandler{ //真实要被代理的对象 private object study; public studyproxy(object study){ this.study=study; } /** * 当被代理对象执行自己的方法时,便会执行这个方法 */ public object invoke(object object, method method, object[] args) throws throwable { object obj=null; system.out.println("代理执行前我可以执行一些操作"); //执行被代理对象的方法 obj = method.invoke(study, args); system.out.println("代理执行后我还可以执行一些操作"); return obj; } }
测试类
package com.yasin.javalearn; import java.lang.reflect.field; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; import java.text.parseexception; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.hashmap; import java.util.iterator; import java.util.list; import java.util.map; import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import org.apache.log4j.logger; import org.apache.log4j.propertyconfigurator; import org.apache.log4j.xml.domconfigurator; import com.yasin.proxylearn.istudy; import com.yasin.proxylearn.study; import com.yasin.proxylearn.studyproxy; /** * hello world! * */ public class app { public static void main(string[] args) { istudy study = new study(); invocationhandler handler = new studyproxy(study); istudy proxystudy =(istudy)proxy.newproxyinstance(thread.currentthread().getcontextclassloader(), new class[] {istudy.class}, handler); proxystudy.learn(); system.out.println(proxystudy.getkonwledge()); } }
以上就是java动态代理的基础使用,在spring aop及rpc的远程服务端的实现要比这复杂下,以后会在深入探讨的。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!