下面的代码 输出什么 为什么? 非常感谢 一窍不通 非常崩溃
package com.weportal.reflect;public interface SayInterface {
public void say();
}
-------------------------------------------------------------------
package com.weportal.reflect;public class SayClass implements SayInterface{

public void say(){
System.out.println("已经调用了say方法");
}
}
--------------------------------------------------------------------
package com.weportal.reflect;import java.lang.reflect.*;public class SayProxy implements InvocationHandler{

    private SayClass sayclass = new SayClass();
    
    public static void main(String[] args) {
        SayProxy sp = new SayProxy();
        SayInterface sc = (SayInterface)Proxy.newProxyInstance(
            sp.getClass().getClassLoader(),sp.sayclass.getClass().getInterfaces(),sp);
        sc.say();
    }  
    
    public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
        System.out.println("准备调用"+method.getName()+"方法");
        return method.invoke(sayclass,args);
    }    
}

解决方案 »

  1.   

    这不是动态代理吗?
    给你指个地方,自己学习去:
    http://java.sun.com/j2se/1.6/docs/guide/reflection/proxy.html
      

  2.   

    不好意思,网址写错了,应该是:
    http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html
      

  3.   

    准备调用say方法
    已经调用了say方法
      

  4.   

    准备调用say方法
    已经调用了say方法
      

  5.   

    这个地方讲的很详细啊:
    http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html
    简单来说
    Proxy.newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler handler)
    能返回一个实例,该实例继承了Proxy,实现了interfaces指定的所有接口,这些实现就是简单的调用InvocationHandler的invoke方法,将所有通过interfaces的调用代理到handler上。
    InvocationHandler.invoke(Object proxy, Method method, Object[] args) 方法中proxy就是指代理实例本身,method就是当前调用的方法,args就是调用法的参数。
      

  6.   

    底层实现就是虚拟机动态产生了个类,该类只在运行时存在,然后动态实力化了该类,该类就是继承了Proxy类,实现了指定接口,实现方法就是将调用代理给InvocationHandler,明白了吧。
      

  7.   

    我也曾写过类似这样的类,我的那个类更加泛化,是继承一个普通类,实现一批任意接口,我用的是ASM来实现这个动态类的。
      

  8.   

    ClassLoader loader
    这个东西是干啥的?另外调用sc.say();这个的时候是怎么调用到了
    这个重写了的方法的呢public Object invoke
    是InvocationHandler handler 这个参数调用的吗呵呵 这个是我看完这道问题侯想的。。
      

  9.   

    加载类使用啊,有些应用服务器类系统比如EJB中间件容器使用它来加载特定的过滤插件,这些插件不是系统标准的,所以要使用特有的classloader来寻找和加载类。
    调用顺序是:
    sc.say->proxy.invoke->method.invoke->saylclass.say