Java动态代理概述
首先我们解释一下代理是什么意思,大家的微信里有很多做微商的朋友。很多微商的销售模式就是代理模式。比如店主小二在微信朋友圈卖衣服,小王看到了小二发的朋友圈就找小二买衣服,而小二只是一个代理商,它的衣服是从小一那里拿的。
在这个过程中小二就是小一的代理,代理对卖衣服这个行为进行的增强,把原来10块钱一件的衣服卖到了20块,并且购买成功还赠送小礼品。
Java动态代理指的是在程序运行时,为已有对象生成代理对象,对原有对象的方法进行功能增强。
目标接口和实现类
JDK动态代理要求目标类(被代理的类)必须实现一个接口。如下面的TestDaoImpl类是实现了TestDao接口,这样TestDaoImpl就可以成为动态代理的目标类。
public interface TestDao {
public void save();
public void delete();
public void update();
}
public class TestDaoImpl implements TestDao {
@Override
public void save() {
System.out.println("保存");
}
@Override
public void delete() {
System.out.println("删除");
}
@Override
public void update() {
System.out.println("修改");
}
}
目标接口功能增强的处理器
JDK提供了一个InvocationHandler接口和一个Proxy类。Proxy类用于为TestDao的实现类生成代理对象,InvocationHandler用于处理代理对象调用方法时如何进行功能增强。
public class TestDaoHandler implements InvocationHandler {
TestDao testDao;
public TestDaoHandler(TestDao testDao) {
this.testDao = testDao;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行"+method.getName()+"方法功能增强");
//执行目标方法
Object obj = method.invoke(testDao,args);
System.out.println("执行"+method.getName()+"方法后功能增强\n");
//返回方法的结果
return obj;
}
}
生成代理对象
写一个测试类,生成动态代理对象并执行方法,观察方法进功能是否有增强。
public class JDKDynamicProxyDemo {
public static void main(String[] args) {
//1.创建目标对象
TestDao testDao=new TestDaoImpl();
//2.创建TestDao的功能增强处理器
TestDaoHandler handler=new TestDaoHandler(testDao);
//3.为TestDao创建代理对象
TestDao testDaoProxy = (TestDao) Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),
testDao.getClass().getInterfaces(),
handler);
//4.使用代理对象调用save
testDaoProxy.save();
testDaoProxy.delete();
testDaoProxy.update();
}
}