下面的代码 输出什么 为什么? 非常感谢 一窍不通 非常崩溃
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);
}
}
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);
}
}
给你指个地方,自己学习去:
http://java.sun.com/j2se/1.6/docs/guide/reflection/proxy.html
http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html
已经调用了say方法
已经调用了say方法
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就是调用法的参数。
这个东西是干啥的?另外调用sc.say();这个的时候是怎么调用到了
这个重写了的方法的呢public Object invoke
是InvocationHandler handler 这个参数调用的吗呵呵 这个是我看完这道问题侯想的。。
调用顺序是:
sc.say->proxy.invoke->method.invoke->saylclass.say