Java动态代理
最近发现很多项目都用到了动态代理,就又认真学习了下Java动态代理。代理模式应用在很多地方,但是如果在编码的时候就添加代理类,那整个代码就会变的非常冗余,繁琐。这样动态代理就应运而生了,动态代理的代理是在程序运行的时候动态生成的。动态代理只需要提供一组接口,以及被代理的对象,程序就会自动生成代理类,而且你还可以在运行方法的前后做一些自己需要的操作,甚至于不执行方法。
下面介绍一个动态代理的例子。
首先是一个被代理的类,以及类实现的接口
public interface ProxyInterface{
void doProxy();
}
public class ProxyObject implements ProxyInterface{
public void doProxy(){
System.out.println("hello proxy object");
}
}
然后有一个对代理运行的时候调用处理的Handle类
public class TestProxyHandler implements InvotationHandler{
Object proxyObject = null;
public TestProxyHandler(Object proxyObject){
this.proxyObject = proxyObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object result = method.invoke(proxyObject,args);
}
使用这些代理的代码
ProxyObject object = new ProxyObject();
TestProxyHandler proxyHandler = new TestProxyHandler(object);
ProxyInterface proxyInterface = (ProxyInterface)Proxy.newProxyInstance(ProxyObject.class.getClassLoader(),
object.getClass().getInterfaces(),
proxyHandler);
proxyInterface.doProxy();
通过Proxy的newProxyInstance方法产生了一个新的代理对象,这个代理对象实现了指定的接口(方法newProxyInstance第二个参数传入的内容)。程序在运行的时候会执行proxyHandler的invoke方法,我们可以在invoke方法里面做自己需要做的一些操作。
上面就是动态代理的一个非常简单的例子。一个最明显的特征就是代理对象不是单独作为一个类,而是有java代理代码自动生成,其中生成的代理对象内部又引用了InvotationHandler,由InvotationHandler连接与被代理对象。
##优势
- Proxy的代码量是固定的了,不会变成一堆庞大的代码
- 可以实现AOP编程
看着动态代理似乎简单,但是应用起来非常广泛,而且有很多意想不到的巧妙。