最近在读曾宪杰的java中间件,这本书还是很值得推荐的,书中讲解的动态代理也是不多哔哔,几句话就说出了重点。
下面是一些总结:
首先来看一下静态代理
业务实现类:
package dynamicproxy;
public class CalculatorImpl implements Calculator
{
@Override
public int add(int a, int b)
{
return a + b;
}
}
代理类:
package dynamicproxy;
public class CalculatorProxy implements Calculator
{
private Calculator calculator;
public CalculatorProxy(Calculator calculator)
{
this.calculator = calculator;
}
@Override
public int add(int a, int b)
{ // do other thing before
int result = calculator.add(a, b);
// do other thing after
return result;
}
}
OK这很容易看明白,就是代理类代理具体业务对象在执行方法前后做些事情。那么有个减法类但是我们代理它做的事情和加法这个代理类完全一样我们在继续写一个减法的代理类?
答案显然是否定的:动态代理就是解决这类问题的:对于做同样事情的代理我们只需实现一遍。根据运行时候对象去确定该调用那个具体的业务操作。不难想象这玩意是用反射搞的。有兴趣的自己可以去实现一下,jdk是对动态代理有支持这对我们来说是福音。代理对象只需要实现InvocationHandler就可以啦
下面是动态代理的一个简单实现:
package dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogHandler implements InvocationHandler
{
Object object;
public LogHandler(Calculator object)
{
this.object=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println("记录操作日志执行方法前--執行了:"+method.getName());
Object o=method.invoke(object, args);
return o;
}
}
测试:
package dynamicproxy;
import java.lang.reflect.Proxy;
public class TestDynamicProxy
{
public static void main(String[] args)
{
Calculator calculator=new CalculatorImpl();
LogHandler handler=new LogHandler(calculator);
Calculator proxy=(Calculator) Proxy.newProxyInstance(calculator.getClass().getClassLoader(), calculator.getClass().getInterfaces(),handler);
proxy.add(5, 5);
}
}