黑马程序员技术交流社区
标题:
动态代理类的invoke方法中传入的方法是谁的方法??
[打印本页]
作者:
黄云南
时间:
2012-3-29 02:48
标题:
动态代理类的invoke方法中传入的方法是谁的方法??
本帖最后由 黄云南 于 2012-3-29 02:50 编辑
class Test2 {
public static void main(String[] args) {
Collection proxyArrayList = (Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler() {
ArrayList target = new ArrayList();
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println(method);
System.out.println(target.getClass().getMethod("add", Object.class));
Object obj = method.invoke(target, args);
return obj;
}
});
proxyArrayList.add("abc");
}
复制代码
打印结果:
public abstract boolean java.util.Collection.add(java.lang.Object)
public boolean java.util.ArrayList.add(java.lang.Object)
上面是张孝祥老师讲解动态代理类时的一段代码,我很奇怪传进invoke的那个method是谁的方法,于是改了下代码验证,
method的字节码对象和target的add方法的字节码文件不一样啊,也就是method的add方法不是target的add方法。
method的add方法是public abstract boolean java.util.Collection.add中的方法他的方法是空的啊怎么能调用invoke方法,
更奇怪的是一个空的方法怎么向集合中添加元素呢。
作者:
yangshang1
时间:
2012-3-29 06:02
import java.lang.reflect.*;
public class TestAgent {
public static void main(String[] args) {
Agent agent=new Agent();
BAgentFace bAgentFace=null;
agent.setObj(new BAgent());
bAgentFace=(BAgentFace)Proxy.newProxyInstance(BAgentFace.class.getClassLoader(),new Class[]{BAgentFace.class},agent);
bAgentFace.add();
}
}
class Agent implements InvocationHandler
{
private Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(obj,args);
}
}
class BAgent implements BAgentFace
{
public void add()
{
System.out.println("ni hao");
}
}
interface BAgentFace
{
public void add();
}
作者:
王国华
时间:
2012-3-29 11:17
本帖最后由 王国华 于 2012-3-29 11:42 编辑
这里利用了java中一个重要的特征,多态,简单点说,父类引用指向了子类对象,其实就是
Collectioin target =new ArrayList();
tartget.add();
多态的出现是为了增强程序的扩展性,如果你把target换成别的集合还可以使用这个程序,如果你写成ArrayList它就是一个死程序,没有扩展性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2