我正在阅读 JVM 规范第 2 版。在本节(Loading)中,ClassCircularityError 被定义为当一个类无法加载时抛出,如果它是它自己的超类或超接口。我无法想象/想象它,因为当我编译这样一个类时,java编译器会阻止我并且不会让我继续。那么如何创建这样的.class来加载?
public class TestCycle extends TestCycle{
private String memberVar;
}
谁能向我的罐头解释一下?
我正在阅读 JVM 规范第 2 版。在本节(Loading)中,ClassCircularityError 被定义为当一个类无法加载时抛出,如果它是它自己的超类或超接口。我无法想象/想象它,因为当我编译这样一个类时,java编译器会阻止我并且不会让我继续。那么如何创建这样的.class来加载?
public class TestCycle extends TestCycle{
private String memberVar;
}
谁能向我的罐头解释一下?
在 Java 中,编译的单位是类,因此类很可能在不同的时间编译,例如因为类是独立开发的,因为它们位于不同的库中。考虑:
class A {}
到时候别人
class B {}
现在,A 的制造者决定他们想要扩展 B:
class A extends B {}
而 B 的制造者决定他们想要扩展 A,但不知道前者的变化,即仍然有 A 的原始定义:
class B extends A{}
后来,他们意识到有一个新版本的 A 可用,并将其放在类路径中,导致加载时出现 ClassCircularityError。
您可以通过直接编辑类文件来创建这样的类文件(我的意思是如果您真的想要)。所以虽然它不能编译,但可以创建一个有效的类文件,包括这样的类。这就是 JVM 也会检查它的原因。