2012-05-26 2 views
0

JVM 사양 2 판을 읽고 있습니다. 이 절 (Loading)에서 클래스 자체 고유의 수퍼 클래스 또는 수퍼 인터페이스 인 경우 클래스를로드 할 수없는 경우 ClassCircularityError가 throw되도록 정의됩니다. 나는 그림을 그릴 수 없거나 그러한 클래스를 컴파일 할 때 자바 컴파일러가 나를 멈추게하고 계속 진행시키지 않을 것이다. 그런 클래스가 어떻게로드 될 수 있는가?Java ClassCircularity 오류, 런타임 또는 컴파일 시간이 있습니까?

public class TestCycle extends TestCycle{ 
private String memberVar; 
} 

사람이 내 항아리 헤드에이 제발 설명 할 수 있습니까?

답변

3

자바에서는 컴파일 단위가 클래스이므로 클래스가 별도의 라이브러리에 있기 때문에 클래스가 개별적으로 개발 되었기 때문에 클래스가 다른 시간에 컴파일되었을 가능성이 큽니다. 고려 : 다른

class A {} 

누군가를 다음

class B {} 

는 이제,의 업체들이 B 확장 할 것을 결정 :

class A extends B {} 

와 B의 업체들이 원하는 것을 결정 A를 확장하지만 이전 변경 사항을 알지 못합니다. 즉 A는 원래 정의가 그대로 유지됩니다.

class B extends A{} 

나중에 A의 새 버전을 사용할 수 있음을 알고 클래스 경로에 넣으면로드시 ClassCircularityError가 발생합니다.

1

클래스 파일을 직접 편집하여 이러한 클래스 파일을 만들 수 있습니다 (실제로 원한다면). 따라서 컴파일되지는 않지만 그러한 클래스를 포함하여 유효한 클래스 파일을 만들 수 있습니다. 그래서 JVM이이를 확인합니다.