要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式。
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的:
InvocationHandler:
InvocationHandler is the interface implemented by the invocation handler of a proxy instance.
Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler.
![要想了解Java 动态代理,你要学会这些!](http://p2.ttnews.xyz/loading.gif)
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
一个动态代理的demo
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloServiceProxy implements InvocationHandler {
private Object target;
/**
* 绑定委托对象并返回一个【代理占位】
* @param target 真实对象
* @return 代理对象【占位】
*/
public Object bind(Object target, Class[] interfaces) {
this.target = target;
//取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
/**
* 同过代理对象调用方法首先进入这个方法.
* @param proxy --代理对象
* @param method -- 方法,被调用方法.
* @param args -- 方法的参数
*/
public Object invoke(Object proxy , Method method, Object[] args) throws Throwable {
System.err.println("############我是JDK动态代理################");
Object result = null;
//反射方法前调用
System.err.println("我准备说hello。");
//反射执行方法 相当于调用target.sayHelllo;
result=method.invoke(target, args);
//反射方法后调用.
System.err.println("我说过hello了");
return result;
}
}
![要想了解Java 动态代理,你要学会这些!](http://p2.ttnews.xyz/loading.gif)
其中,bind方法中的newProxyInstanc方法,就是生成一个代理对象,第一个参数是类加载器,第二个参数是真实委托对象所实现的的接口(代理对象挂在那个接口下),第三个参数this代表当前HelloServiceProxy类,换句话说是使用HelloServiceProxy作为对象的代理。
尚学堂12大精英团队+各类实战项目,真正实现1+1>10的目标效果。帮助学员迅速成长,持久腾飞,成就学员“高富帅”人生;帮助企业技术和团队成长,成就百年中华名企;助力中国持续成为世界强国而贡献力量。尚学堂12大精英团队,覆盖IT行业十大领域,实战团队240人,服务学员累计超过10万人,就业合作企业数量500+。
閱讀更多 Java的筆記 的文章