//这里为申明公共接口,
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分诚心求教.得到满意答案即给分.

解决方案 »

  1.   

    invoke(?,?,?)是通过反射由代理对象来调用的。
    当你得到了代理对象后,调用公共的方法时,就会来执行invoke(?,?,?),在这个方法体中有result=method.invoke(this.targetobject, args); 这个才是真正执行你实现接口的那个方法。
      

  2.   

    http://blog.csdn.net/sunyujia/archive/2008/06/01/2500684.aspx
    自己看
      

  3.   


    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对象进行匹配检查
      

  4.   

    http://blog.csdn.net/sunyujia/archive/2008/06/01/2500684.aspx 
      

  5.   

    先看这个静态方法:
    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作为内部类独立出来, 看起来舒服多了.
    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一下, 多看几次, 就理解了.
    其实说实话,项目中你会需要你这么自己去实现一个代理框架, 有太多现成的. 理解思想最重要.
      

  6.   

    上面最有一句话说错了, 应该是
    项目中你不需要你这么自己去实现一个代理框架, 有太多现成的. 比如spring aop,理解思想最重要.