`Class<? extends BaseTab>.newInstance()` throws java.lang.StackOverflowError with Reflections

`Class<? extends BaseTab>.newInstance()` throws java.lang.StackOverflowError with Reflections

代码:

Reflections reflections = new Reflections("com.erby.tab.tabs");

for(Class<? extends BaseTab> t : reflections.getSubTypesOf(BaseTab.class)) {
    try {
        BaseTab tab = t.newInstance();

        System.out.println(tab.toString());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

BaseTab.java:

public abstract class BaseTab extends Tab implements Serializable {
    public abstract String getPrefix();

    @Override
    public abstract String toString();
}

HomeTab.java:

public class HomeTab extends BaseTab {
    public HomeTab() {
        setText(toString());
    }

    @Override
    public String getPrefix() {
        return "home";
    }

    @Override
    public String toString() {
        return "Home Tab";
    }
}

当调用它时我得到:

Caused by: java.lang.WhosebugError
at sun.misc.URLClassPath.getLoader(URLClassPath.java:476)
at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
at sun.misc.URLClassPath.access0(URLClassPath.java:64)
at sun.misc.URLClassPath.next(URLClassPath.java:239)
at sun.misc.URLClassPath.hasMoreElements(URLClassPath.java:250)
at java.net.URLClassLoader.run(URLClassLoader.java:601)
at java.net.URLClassLoader.run(URLClassLoader.java:599)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.next(URLClassLoader.java:598)
at java.net.URLClassLoader.hasMoreElements(URLClassLoader.java:623)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at org.reflections.util.ClasspathHelper.forResource(ClasspathHelper.java:61)
at org.reflections.util.ClasspathHelper.forPackage(ClasspathHelper.java:51)
at org.reflections.util.ConfigurationBuilder.build(ConfigurationBuilder.java:93)
at org.reflections.Reflections.<init>(Reflections.java:170)
at org.reflections.Reflections.<init>(Reflections.java:143)
at com.erby.tab.tabs.TestTab.<init>(TestTab.java:20)
at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at com.erby.tab.tabs.TestTab.<init>(TestTab.java:24)
at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at com.erby.tab.tabs.TestTab.<init>(TestTab.java:24)
at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)

FYI BaseTab 正在扩展 javafx 标签。

我发现它在每个 class 上迭代并在它收到错误之前创建了数百个实例。 问题是我的代码哪里出错了,我该如何解决?谢谢。

循环在构造函数中。不断重复自己。

正如您在评论中所写,第一个代码片段出现在构造函数中。该片段创建了新实例,这导致该构造函数被再次调用。这会导致以堆栈溢出错误结束的无限递归。

我认为还有另一个名为 TestTab 的子class 正在从它的构造函数中重复初始化。我从您的错误消息中看到了这一点。检查出。尽管如此,我没有看到任何这样的 class 名字 TestTab