之前转载了一个关于java动态代理的文章,研究了一下,下面的内容是我根据自己理解总结的,如果由错误的地方欢迎各位大神们指教,必定感激不尽!
Proxy类的总结:(例子是我转载的博客:这是链接)
简单的说要想实现动态代理来改造要代理对象的方法,就要做以下几步:
1.写一个类实现InvocationHandler接口
例子中的HelloWorldHandler类就是
2.找到要被代理的对象,没有的话就创建
就像例子中的HelloWorld helloWorld = new HelloWorld(); helloWorld就是将要被代理的对象
3.创建InvocationHandler接口的实例(即第一步中实现了InvocationHandler接口的类)将要被代理的对象作为参数传入
InvocationHandler handler = new HelloWorldHandler(helloWorld);
4.在实现了InvocationHandler接口的类中,加出未实现的方法invoke(Object proxy, Method method, Object[] args);
参数:proxy要代理的对象,method要代理的对象中的方法,args要代理对象方法里的参数
如果不需要改变原始对象中的方法,要在调用代理对象的方法之前和之后做操作,如例子中的doBrfore();和doAfter();
如果要改造对象中的某个方法(如abc();方法)则用“abc”.equals(method.getName()判断当前执行的方法,再去改造里面的逻辑
5.创建动态代理类对象 newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
loader - 定义代理类的类加载器,interfaces - 代理类要实现的接口列表,h - 指派方法调用的调用处理程序
例子中的:HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(),
handler);
proxy就是代理之后的对象
其实还可以简单的写成这样:
用匿名内部类代替实现接口
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 参数:proxy要代理的对象,method要代理的对象中的方法,args要代理对象方法里的参数
// 如果不需要改变原始对象中的方法,要在调用代理对象的方法之前和之后做操作,如例子中的doBrfore();和doAfter();
// 如果要改造对象中的某个方法(如abc();方法)则用“abc”.equals(method.getName()判断当前执行的方法,再去改造里面的逻<span style="white-space:pre"> </span>// 辑
}
});
proxy就是代理后的对象