java动态代理的流程问题,急,麻烦大侠们给点详细说明,越细越好
时间:2008-09-28 11:15:16
来源:论坛整理 作者: 编辑:chinaitzhe
package com.sourpuss.proxy;
public interface CommInterface {
public void add(String username,String password);
public void delete(int id);
public void modifer(int id,String username,String password);
public String query(int id);
}
//下面为目标对象
package com.sourpuss.proxy;
public class Targeter implements CommInterface {
public void add(String username, String password) {
System.out.println("----------Targeter.add()" username "---" password "------------");
}
public void delete(int id) {
System.out.println("----------Targeter.delete()------------");
}
public void modifer(int id, String username, String password) {
System.out.println("----------Targeter.modifer()------------");
}
public String query(int id) {
System.out.println("----------Targeter.query()------------");
return null;
}
}
//下面为实现invocationHandler的类及相关方法(我的问题的在)
package com.sourpuss.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler {
private Object targetobject;
public Object getProxyer(Object targetobject) {
this.targetobject = targetobject;
return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),
targetobject.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args);
return result;
}
public void intercepter(){
System.out.println("this is a intercepter!");
}
}
//主程序
package com.sourpuss.proxy;
public class Client {
public static void main(String[] args) {
DynamicProxyHandler proxyHandler=new DynamicProxyHandler();
CommInterface proxy=(CommInterface)proxyHandler.getProxyer(new Targeter());
proxy.add("sourpuss", "132");
}
}
我的问题是:程序中用红色标出的部分,public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args);
return result;
invoke(?,?,?)这个方法的用途,及method.invoke(?,?)是何是调用的,由谁来调用?????
希望能得到详细的程序流程,谢谢大家,虽然我没多少分,但还是拿出100分诚心求教.得到满意答案即给分.
网友回复:invoke(?,?,?)是通过反射由代理对象来调用的。
当你得到了代理对象后,调用公共的方法时,就会来执行invoke(?,?,?),在这个方法体中有result=method.invoke(this.targetobject, args); 这个才是真正执行你实现接口的那个方法。
网友回复:http://blog.csdn.net/sunyujia/archive/2008/06/01/2500684.aspx
自己看
网友回复:
- Java code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result; intercepter(); result=method.invoke(this.targetobject, args); return result; }
JDK的动态代理是需要配合Proxy和InvocationHandler两个类一起使用的,代理类是有Proxy的newProxyInstance()方法产生的
产生的代理类中所有非final方法的调用都会触发绑定的InvocationHandler实例的invoke方法,即都会启动代理流程,那几个参数作用如下:
1、proxy: 字面上看指代理原对象,但传进来未必是,所以用来检测本次代理中对该方法是否有访问权限
2、method: 触发代理的调用方法对象
3、args: 调用方法所需要的参数,也会和Method对象进行匹配检查
网友回复:http://blog.csdn.net/sunyujia/archive/2008/06/01/2500684.aspx
网友回复:该回复于2008-09-23 06:10:08被版主删除
网友回复:先看这个静态方法:
Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
第一个参数是要得到当前被代理对象的classLoader, 这个与代理的底层实现和反射有关, 可以不管他;
第二个参数得到被代理对象实现的接口; 为什么要得到它呢? 不考虑反射的知识, 那么从表面上看,newProxyInstance方法返回的对象也实现了这个接口, 所以newProxyInstance返回的对象具有目标对象一样的功能.
第三个参数: 你这里放的是this, 去看看jdk,这第三个参数应该是一个InvocationHandler接口的实现类, 那么这里的this是可以的, 因为你的当前类DynamicProxyHandler实现了InvocationHandler接口.为什么这里要放InvocationHandler的实现类? 因为我们的代理方法既然是给别人作代理, 那就应该不光是完成目标对象的工作, 还要作更多附加的工作.像你的intercepter方法就是在作这个附加的工作. 这是代理的本分, 也是我们要用代理的原因之一. 所以这里的InvocationHandler的实现类就是一个拦截器, 当你调用代理对象的方法的时候, 拦截器会截获这个调用, 然后作一些附加的工作, 再调用代理对象本身的方法.看你的invoke方法的代码:
intercepter(); //实现增强功能
result=method.invoke(this.targetobject, args); //调用目标对象的方法;
我给你一个生成代理的另外一个写法, 你看着会更容易理解一些, 其实这个方法在 <spring2.0核心技术最佳实件>中讲到过.
这里面把InvocationHandler作为内部类独立出来, 看起来舒服多了.
- Java code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ public class ProxyFactory{ public static Object createProxy(final Object target){ //return target; return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在这里做一些代理对象做的附加工作,比如 //intercepter(); return method.invoke(target, args); } } ); } }
最后看你的测试代码:
CommInterface proxy=(CommInterface)proxyHandler.getProxyer(new Targeter());
proxy.add("sourpuss", "132");
你用的是返回的代理对象, 这个代理对象不同于你的接口, 也不同与你的接口实现类, 他是通过反射方法动态生成的一个新的object, 这个object从表面上看, 它实现了你的接口.
不知道这么说你明白否?找本书, 或者google一下, 多看几次, 就理解了.
其实说实话,项目中你会需要你这么自己去实现一个代理框架, 有太多现成的. 理解思想最重要.
网友回复:上面最有一句话说错了, 应该是
项目中你不需要你这么自己去实现一个代理框架, 有太多现成的. 比如spring aop,理解思想最重要.
关键字:大侠,流程,
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面