java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 Java 中反射动态代理接口的详解及实例的相关资料, 需要的朋友可以参考下
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 框架。
来源: http://www.phperz.com/article/17/1222/357702.html