在使用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!