使用jdk的代理-Proxy动态代理

核心思想:反射,不改变原有代码,使用代理对象执行原有方法,侵入原始类内部 用处:解耦,切面编程

CalculatorProxy.java

public class CalculatorProxy {
	
	/**
	   *    代理
	 * @param calcultor
	 * @return
	 */
	public static Calcultor getCaluctor(Calcultor calcultor) {
		ClassLoader loader = calcultor.getClass().getClassLoader();
		Class<?>[] interfaces = calcultor.getClass().getInterfaces();
		InvocationHandler h = new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("代理对象执行中,,,,,,,,,");
				return method.invoke(calcultor, args);
			}
		};
		return (Calcultor) Proxy.newProxyInstance(loader, interfaces, h);
	}

}

TestAOP.java

public class TestAOP {
	@Test
	public void test01() {
		Calcultor calcultor = new MyMathCaluctor();
		Calcultor Proxy = CalculatorProxy.getCaluctor(calcultor);
		Proxy.add(2, 3);
	}
}

Proxy动态代理缺陷

  1. 编写困难

  2. 如果目标对象没有实现任何接口,则无法创建代理对象Proxy.newProxyInstance(loader, interfaces, h); interfaces 无法传参