详解java动态代理模式
程序员文章站
2024-03-09 12:27:11
本文针对java动态代理进行知识点整理,具体内容如下
一. java的动态代理(比较官方说法)
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的...
本文针对java动态代理进行知识点整理,具体内容如下
一. java的动态代理(比较官方说法)
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
二. 动态代理实现
java.lang.reflect.proxy,
proxy 提供用于创建动态代理类和实例的静态方法.
newproxyinstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
2.1. dao接口(提供模拟数据访问层接口)
package javaproxy; /* * 定义一个数据访问层接口 */ public interface dao { //模拟数据保存 public void save(); }
2.2. daoimpl类实现类
package javaproxy; public class daoimpl implements dao{ @override public void save() { system.out.println("执行一个保存方法。。。。。。。。。。。。"); } }
2.3. 代理处理类
package javaproxy; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; public class daohandler implements invocationhandler{ private object obj; public daohandler(object obj) { this.obj=obj; } @override public object invoke(object proxy, method method, object[] args) throws throwable { system.out.println("do something before method");//这里模拟aop的前置方法 object ret = method.invoke(this.obj, args); system.out.println("do something after method");//这里模拟aop的后置方法 return ret; } }
2.4. client调用
package javaproxy; import java.lang.reflect.proxy; public class client { public static void main(string[] args) { // 元对象(被代理对象) daoimpl daoimpl = new daoimpl(); // 业务代理类 daohandler daohandler=new daohandler(daoimpl); dao dao=(dao) proxy.newproxyinstance(daoimpl .getclass().getclassloader(), daoimpl.getclass() .getinterfaces(), daohandler); dao.save(); } }
2. 5. 结果
3. 模拟mybatis中的代理实现
3.1. mapperproxy类
package javaproxy; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; public class mapperproxy implements invocationhandler { @suppresswarnings("unchecked") /* * 这里通过静态方法得到实现类的对象 * * @param:接口 * * @param:用sqlsession执行方法 * * @return: 返回代理对像 */ public static <t> t newmapperproxy(class<t> mapperinterface, object sqlsession) { classloader classloader = mapperinterface.getclassloader(); class<?>[] interfaces = new class[] { mapperinterface }; mapperproxy proxy = new mapperproxy(); return (t) proxy.newproxyinstance(classloader, interfaces, proxy); } /* * (non-javadoc) * * @see java.lang.reflect.invocationhandler#invoke(java.lang.object, * java.lang.reflect.method, java.lang.object[]) * * @param:代理对象 * * @param:方法通过方法名字找到对应的方法 * * @param:通过方法传入对象找到对应的传递参数映射 * * @return:返回执行后的参数对象 */ public object invoke(object proxy, method method, object[] args) throws throwable { // 这里通过方法名字以及参数通过解析对应的mapper来执行对应的操作 system.out.println("在这里执行实际方法"); return null; } }
3.2. client
package javaproxy; import java.lang.reflect.proxy; public class client { public static void main(string[] args) { dao dao=mapperproxy.newmapperproxy(dao.class, null); dao.save(); } }
3.3. 结果
以上是使用jdk动态代理的例子,希望对大家学习java程序设计有所帮助。