Java 代理示例正在创建堆栈溢出?

标签 java reflection

我正在整理一些关于 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/

相关文章:

java - OutputStreamWriter 与 FileWriter

Java 相当于数据库 IN

c# - 在网站中使用反射访问 AssemblyInfo.cs 中的信息

c# - 跨 .Net 平台序列化 TypeInfo/Type

java - Jersey 与 liferay、Servlet 到 portlet 转换

java - 调试外部启动的 jar 文件

Java 使用 Spring 从 5 升级到 8

c# - 需要在 .NET 中使用反射调用 COM 组件

android - 为什么反射会减慢android手机的速度

c# - 如果类是 WinRT 类型,如何使用 C# 反射来确定