代理三要素:
1)被代理的目标
2)代理的增强类
3)增强类和目标的关联
JDK动态代理,1.3版本开始提供,在不改变目标对象代码情况下,在JVM虚拟机内部,动态为目标对象的接口生成代理类 ------ 动态
一:创建被代理的目标接口和实现类
public interface ProductService {
public void add();
public void edit();
public void delete();
public void query();
}
// 实现类
public class ProductServiceImpl implements ProductService {
@Override
public void add() {
System.out.println("添加商品...");
}
@Override
public void edit() {
System.out.println("修改商品...");
}
@Override
public void delete() {
System.out.println("删除商品...");
}
@Override
public void query() {
System.out.println("查询商品...");
}
}
二:JDK动态代理工厂(代理增强类)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 对目标对象 生成Jdk动态代理
public class JdkProxyFactory implements InvocationHandler {
// 被代理目标对象
private Object target;
// 1、 构造器 ,传入目标对象
public JdkProxyFactory(Object target) {
this.target = target;
}
// 2、提供创建代理对象的方法
public Object createProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
// 3、编写回调函数,拦截目标对象所有方法,都会执行invoke方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("记录日志:" + method.getName() + "方法被执行了...");
return method.invoke(target, args);
}
}
三:设置关联关系
public class JdkProxyTest {
@Test
// JDK代理
public void testJdkProxy() {
// 目标对象
ProductService target = new ProductServiceImpl();
// 创建代理
JdkProxyFactory factory = new JdkProxyFactory(target);
ProductService proxy = (ProductService) factory.createProxy(); // 代理面向接口
// 通过代理调用方法
proxy.add();
proxy.edit();
proxy.query();
}
}
执行测试类结果: