`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
。
代码:
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
。