如何重现ClassCircularityError

时间:2017-06-19 13:31:48

标签: java jvm

是否有人知道如何重现除java.lang.ClassCircularityError以外的throw new ClassCircularityError(...)?如果可能的话,你能告诉我一个总是出现错误的示例main()程序吗?

根据Javadoc

  

当Java虚拟机在正在加载的类的超类层次结构中检测到循环时抛出。

1 个答案:

答案 0 :(得分:2)

除非运行时使用的某些库版本与用于编译的库版本不匹配,否则通常不会发生此错误。

您可以使用单独的编译轻松重现错误。

首先,使用以下定义编译A.java

class B {}
class A extends B {}

然后使用反向类层次结构编译B.java

class A {}
class B extends A {}

最后,将第一个编译中的A.class与第二个编译中的B.class组合。之后,尝试运行任一类将导致

Exception in thread "main" java.lang.ClassCircularityError: A
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)