Java中反射动态代理接口的详解及实例
程序员文章站
2024-03-01 08:30:58
java语言中反射动态代理接口的解释与演示
java在jdk1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下...
java语言中反射动态代理接口的解释与演示
java在jdk1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下设计模式的uml图解:
当你调用一个接口api时候,实际实现类继承该接口,调用时候经过proxy实现。
在java中动态代理实现的两个关键接口类与class类分别如下:
java.lang.reflect.proxy
java.lang.reflect.invocationhandler
我们下面就通过invocationhandler接口来实现动态代理过程,通过proxy接口创建
一个代理类,然后测试完整的程序。要实现演示demo需要如下几步:
一:首先定义我们自己的pojo对象接口类iexample与iuser
package com.example.pojo; public interface iexample { public void setname(string name); public string getname(); public void setdesc(string description); public string getdesc(); }
package com.example.pojo; public interface iuser { public void setuserid(string userid); public string getuserid(); public void setusername(string username); public string getusername(); }
二:实现我们自己invocationhandler接口,其中map我用来存储pojo对象的数据,这样做的好处是pojo接口无需再创建实现类,只有定义接口就可以通过代理直接使用该类,这在实际项目开发中非常有用。
package com.example.reflection; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; import java.util.hashmap; import java.util.map; public class myproxyview implements invocationhandler { private map<object, object> map = null; public static object newinstance(class[] interfaces) { return proxy.newproxyinstance(myproxyview.class.getclassloader(), interfaces, new myproxyview()); } private myproxyview() { this.map = new hashmap<object, object>(); } @override public object invoke(object proxy, method method, object[] args) throws throwable { object result = null; string methodname = method.getname(); if (methodname.startswith("get")) { string name = methodname.substring(methodname.indexof("get") + 3); return map.get(name); } else if (methodname.startswith("set")) { string name = methodname.substring(methodname.indexof("set") + 3); map.put(name, args[0]); return null; } else if (methodname.startswith("is")) { string name = methodname.substring(methodname.indexof("is") + 2); return (map.get(name)); } return result; } }
三:通过proxy方法初始化代理得到pojo对象,运行与测试:
package com.example.reflection; import com.example.pojo.iexample; import com.example.pojo.iuser; public class textproxy { public static void main(string[] args) { iexample example = (iexample)myproxyview.newinstance(new class[]{iexample.class}); iuser user = (iuser)myproxyview.newinstance(new class[]{iuser.class}); // aduit bean 1 example.setname("my example"); example.setdesc("my proxy example"); // aduit bean 2 user.setuserid("jia20003"); user.setusername("gloomyfish"); system.out.println("exmaple name : " + example.getname()); system.out.println("exmaple desc : " + example.getdesc()); system.out.println(); system.out.println("user id : " + user.getuserid()); system.out.println("user name : " + user.getusername()); } }
四:运行结果如下:
exmaple name : my example exmaple desc : my proxy example user id : jia20003 user name : gloomyfish
java动态代理方式对框架编程非常重要无论是在web端还是桌面端
而真正把这种技术发扬光大的则是spring框架。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!