我正在整理一些关于 Java 反射的箔片和示例代码。 这是我使用代理的简单示例代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface MyInterface { void foo(); }
class Handler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Called for : " + proxy);
System.out.println("Called with: " + method);
return null;
}
}
public class ProxyExample {
public static void main(String args[]) {
Handler handler = new Handler();
MyInterface proxied = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
new Class[] { MyInterface.class }, handler);
proxied.foo();
}
}
你能猜到会发生什么吗?
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:422)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at java.lang.StringBuilder.<init>(StringBuilder.java:113)
at xxx..Handler.invoke(ProxyExample.java:15)
当我注释掉第一个打印输出时,我得到:
Called with: public abstract void xxx.MyInterface.foo()
知道是什么导致了递归和堆栈溢出吗?
最佳答案
System.out.println("Called for : "+ proxy);
会调用代理的toString()
方法,再次调用Handler,造成无限递归。
关于Java 代理示例正在创建堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28809511/