JDK之动态代理

代理三要素:

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();
   }
}

执行测试类结果:

猜你喜欢

转载自blog.csdn.net/qq_15076569/article/details/82532616