本文针对java动态代理进行知识点整理,具体内容如下
一. JAVA的动态代理(比较官方说法)
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
二. 动态代理实现
java.lang.reflect.Proxy,
Proxy 提供用于创建动态代理类和实例的静态方法.
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
2.1. Dao接口(提供模拟数据访问层接口)
立即学习“Java免费学习笔记(深入)”;
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. 结果
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 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 newMapperProxy(Class 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程序设计有所帮助。
更多详解java动态代理模式相关文章请关注PHP中文网!










