问题描述
在使用java动态代理时遇到一个怪异的现象,不知道正不正常:由Proxy..newProxyInstance()生成的代理对象会同时代理除了接口以外的其他方法。源码如下:public interface Talkable {public void talk();public void cry();}public class Baby implements Talkable{@Overridepublic void cry() {System.out.println("Wa!!!!!!!");}@Overridepublic void talk() {System.out.println("Mun!");}}public class TalkableHandler implements InvocationHandler{private Baby baby;public TalkableHandler(Baby baby){this.baby=baby;}@Overridepublic 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! 问题补充:<div class="quote_title">yy629 写道</div><div class="quote_div"><strong><span style="color: darkblue">会同时生成 equals</strong>,<strong>hashCode</strong>,<strong>toString </strong>三个方法的, 可以看看生成之后的代理类文件.</span><br /><br /><a href="http://yy629.iteye.com/blog/681430" target="_blank">java的动态代理到底生成了什么?</a></div><br />在哪里看生成之后的代理类文件?用反射看吗?
解决方案
会同时生成 [b]equals,hashCode,toString 三个方法的, 可以看看生成之后的代理类文件.[/b]java的动态代理到底生成了什么?