动态代理的实现静态代理和动态代理
一、代理模式的原理 使用一个代理对象将目标真实对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 二、代理模式的实现 使用Java动态代理实现方法日志功能 /*
-
一个计算加减乘除的接口 */ public interface ICalc {
public int add(int a, int b); public int div(int a, int b); public int mul(int a, int b); public int sub(int a, int b); } /*
-
计算加减乘除的接口实现 */ public class IIalImpl implements ICalc {
public int add(int a, int b) { int r = a + b; return r; } public int div(int a, int b) { int r = a - b; return r; } public int mul(int a, int b) { int r = a * b; return r; } public int sub(int a, int b) { int r = a / b; return r; } } /**
-
使用java反向代理模拟日志功能
-
@author user
/ /
-
处理器类 */ class Handler implements InvocationHandler {
Object target; public Handler(Object target) { this.target = target; } //此方法是代理对象发起对任何方法的调用都会进入这个方法 //三个参数:1.obj指代理对象本身 2.method指本次所调用的方法对象 3.args指本次所调用的方法的所有参数 //返回值与目标方法的返回值一致 public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println(method.getName() + "开始,参数是:" + Arrays.toString(args)); Object r = method.invoke(target, args); System.out.println(method.getName() + "结束,结果是:" + r); return r; } } public class TestApp {
@Test public void testApp() { //反向代理的步骤 //1.先创建目标对象,向上转型了 ICalc target = new IIalImpl(); //2.创建目标对象 //他需要三个参数 //类加载器:用于将类加载到内存中,实例化之前进行的步骤 ClassLoader cl = TestApp.class.getClassLoader(); //接口数组:获得真实对象保存的接口 Class[] interfaces = target.getClass().getInterfaces(); //处理器对象 Handler h = new Handler(target); ICalc proxyObject = (ICalc) Proxy.newProxyInstance(cl, interfaces, h);
proxyObject.add(1, 3); proxyObject.div(2, 5); proxyObject.mul(4, 8); proxyObject.sub(4, 2);} }