在使用java动态代理时遇到一个怪异的现象,不知道正不正常:
由Proxy..newProxyInstance()生成的代理对象会同时代理除了接口以外的其他方法。源码如下:
public interface Talkable {
public void talk();
public void cry();
}
public class Baby implements Talkable{
@Override
public void cry() {
System.out.println("Wa!!!!!!!");
}
@Override
public void talk() {
System.out.println("Mun!");
}
}
public class TalkableHandler implements InvocationHandler{
private Baby baby;
public TalkableHandler(Baby baby){
this.baby=baby;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("talk start!");
Object o=method.invoke(baby, args);
System.out.println("talk end!");
return o;
}
}
public class TestTalk {
private static void talksome(Talkable talk) {
/*talk.cry();
talk.talk();*/
talk.hashCode(); //在这里只调用了Object.hashCode()方法,但在输出的信息看到,实际上也调用了代理。
}
public static void main(String[] args) throws Exception{
Talkable talk=(Talkable)Proxy
.newProxyInstance(Talkable.class.getClassLoader(),
new Class[] { Talkable.class }, new TalkableHandler(
new Baby()));
talksome(talk);
}
}
输出的结果:
talk start!
talk end!