2009-03-13 8 views
4

내장 된 Eclipse "컴파일"작업으로 컴파일 된 응용 프로그램이 있습니다. 그런 다음 빌드 프로 시저를 Ant의 javac으로 옮기기로 결정 했으므로 결과가 더 작아졌습니다.컴파일 된 .class 파일의 레이아웃에 영향을주는 설정은 무엇입니까? 두 개의 컴파일 된 클래스가 같은지 어떻게 알 수 있습니까?

나중에 디버그 레벨을 "vars,lines,source"으로 조정하면 이클립스와 동일한 디버그 정보를 임베드 할 수 있다는 것을 알았습니다. 많은 경우 파일이 정확히 같은 크기를 유지했지만 내부 레이아웃이 다릅니다. 결과적으로 md5sum 서명을 사용하여 정확히 동일한 버전인지 확인할 수 없었습니다.

디버그 정보 외에도 2 개의 파일이 서로 다른 내부 레이아웃이나 크기를 갖는 이유는 무엇입니까?

어떻게 컴파일 된 .class 파일을 비교할 수 있습니까?

답변

3

각 필드/메소드/클래스의 속성뿐만 아니라 상수 풀 항목 (본질적으로 모든 기호 정보)의 순서와 같은 순서는 필요하지 않습니다. 다른 컴파일러는 원하는 순서대로 자유롭게 작성할 수 있습니다.

컴파일 된 클래스를 비교할 수 있지만 클래스 파일 구조를 조사하여 파싱해야합니다. BCEL 또는 ASM과 같은 라이브러리가 있습니다.하지만 내가 원하는 것을 도와 줄 수 있는지 100 % 확신하지 못했습니다.

1

가장 중요한 점은 지역 변수의 스택 슬롯을 코드의 의미를 변경하지 않고 임의로 배열 할 수 있다는 것입니다. 기본적으로 컴파일 된 클래스 파일은 구문 분석 및 정규화하지 않고 비교할 수 없습니다. 많은 노력이 필요합니다.

어쨌든 왜 그렇게하고 싶습니까?

+0

흥미 롭습니다. 그냥 호기심에서 그리고 배움을 위해서. 나는 그것이 정말로 의지해서는 안되는 것이란 것을 압니다. –

0

이클립스는 디버거에서 실행을 돕기 위해 일부 계측을 수행하고 있습니까?

+0

나는 그 일을하고 있는지 잘 모르겠습니다. 어떻게 확인할 수 있습니까? –

0

궁극적으로 사용되는 구성이 차이를 만들고 있습니다. 그들이 동일한 버전의 Java를 사용한다고 가정하면, 컴파일 구성 (JDK 호환, 클래스 파일 호환성 및 호스트 디버깅 정보 옵션)에 사용할 수있는 다양한 옵션이 있습니다.

1

Michale B가 말했듯이, 그것은 임의적 일 수 있습니다.

파일 크기를 보안으로 사용하는 시스템에서 작동합니다. .class 파일의 크기가 변경되면 클래스에 특정 권한이 부여되지 않습니다.

일반적으로 쉽게 돌아 다니기는 쉽지만 환경을 완벽하게 제어 할 수 있으므로 실제로는 꽤 기능적입니다.

어쨌든, 감시되는 클래스가 다시 컴파일 될 때마다, 우리는 크기를 다시 계산해야합니다.

또 다른 한가지 - 파일을 컴파일 할 때 특수 키 번호가 생성됩니다. 나는 이것에 대해 많이 알지 못하지만, 종종 수업이 함께하지 못하게합니다. 나는 그 절차가, 클래스 A를 컴파일하고 그것을 저장한다고 믿는다 (a1이라고 부른다). 클래스 a를 다시 컴파일하십시오 (a2). 클래스 a2에 대해 클래스 b를 컴파일합니다. a1에 대해 b를 실행하십시오. 나는이 경우 런타임에 실패 할 것이라고 믿는다.

해당 키 번호에 대해 더 자세히 알 수 있으면 이후 정보를 제공 할 수 있습니다.

1

비교를 위해 클래스 파일을 디 컴파일하여 생성 된 소스로 재생할 수 있습니다. this을 참조하십시오.

2

ASM Eclipse plugin에는 바이트 코드 비교기가 있습니다. 두 클래스를 선택하고 마우스 오른쪽 버튼을 클릭하고/BytesCode와 비교합니다.

2

중요한 점은 Eclipse는 javac을 사용하지 않는다는 점입니다. Eclipse에는 자체 컴파일러 the JDT이 있으므로 결과 .class 파일의 차이가 나를 놀라게하지 않습니다. 나는 그들이 서로 다른 컴파일러이기 때문에 그것들이 축 어적이 아니길 기대한다.

차이점으로 인해 javac로 컴파일되지만 JDT로 컴파일되지 않는 코드가 있으며 그 반대의 경우도 마찬가지입니다. 일반적으로 제네릭을 많이 사용하는 경우이 둘의 차이점이 분명해졌습니다.