2009-10-01 2 views
2

바이트 코드 버전 X가있는 Java 클래스 파일 (ClassName.class)에는 바이트 코드 버전 X로 표현되는 클래스 파일을 바이트 코드 버전 Y로 표현되는 것으로 변환하는 일반적인 방법이 있습니다 ?Java 클래스 파일 용 바이트 코드 버전 간 전환

가정 :

  • 소스 코드를 사용할 수 없습니다. 클래스 파일은 클래스의 유일한 사용 가능한 표현입니다.
  • 클래스 파일이 많이 혼란 스럽기 때문에 jad 또는 유사한 프로그램을 사용하여 클래스를 디 컴파일 한 다음 "-target ..."을 사용하여 클래스를 다시 컴파일하면 작동하지 않습니다. 초기 POST 후에

업데이트 :

  • 업데이트 # 1 : Futhermore, Y 가까이 충분히있는 그 바이트 코드 버전 X와 바이트 코드 버전을 가정 그래서 (현재 바이트 코드 버전 X에서) 클래스에서 사용하는 모든 지침 또한

답변

3

다운 그레이드의 경우 Java 1.3/1.4에서 실행중인 Java 5/6 코드를 가져 오는 다양한 방법을 살펴볼 수 있습니다. 지원은 주석과 같은 최근 기능 (http://asm.ow2.org/)에 필요한 경우 Backport Java 5/6 features to Java 1.4?

+0

대단한 답변을 보내 주셔서 감사합니다! retrotranslator 트릭을 했어! – knorv

+0

거의 모든 도구가 (5/6) -> (이전 버전)입니다. 나는 단지 6 -> 5를 원한다. – nick

+0

역 회전기는 6-> 5를 할 수 있어야합니다. HSqlDB 2를 사용해 보았습니다. 불행히도 새로운 java.sql 클래스를 처리하지 못해 실패했습니다. 그러나 자바 6 API를 사용하지 않는다면 한번 사용해보십시오. –

2

당신이 사용할 수있는 버전 Y.에 존재 Apache BCEL

바이트 코드 기술 장치 g 라이브러리는 사용자에게 분석 만들고, 조작 (바이너리) 자바 클래스 파일

할 수있는 편리한 가능성을 제공 을 목적으로 BCEL 당신에게 그것을 조작, 특정 버전의 클래스 파일에 읽기의 가능성을 제공

새 클래스 파일 스트림을 생성 한 다음 저수준 ClassLoader API를 사용하여 VM에로드합니다. 매우 까다 롭고 의심의 여지가 없으며, 이것이 프로 그레이드 할 수있는 것처럼 쉽게 버전을 다운 그레이드 할 수 있을지는 의문입니다.

+1

ASM이 더 나은 옵션이 될 것 관련 질문에 내 anwser를 참조하십시오. 그렇지 않으면이 접근 방식이 효과적입니다. – McDowell

+1

아, 그래. 나는이 물건들을 실제로 지키지 않고있다. 그것은 나를 두려워한다. – skaffman

1

아니요. 이후 버전의 Java는 해당 바이트 코드를 실행할 수 있지만 업그레이드 할 수는 없습니다. 이후 버전의 클래스 파일은 다른 형식을 갖습니다.

누락 된 바이트 코드를 이전 버전의 Java에서 다른 구문으로 교체 할 방법이 없기 때문에 다운 그레이드 할 수 없습니다.

[편집] IIRC, Sun은 Java의 모든 주요 버전에 대해 최소한 하나의 새 바이트 코드 명령어를 추가했습니다. 이것이 대개 주요 Java 릴리스의 이유입니다. 바이트 코드가 변경되었습니다.

그런데 행운을 시험하고 major version of the class file을 변경하고 최신 VM에서로드되는지 확인하십시오. 어떤 복잡한 예에서도 작동 할 것 같지 않지만 운이 좋을 수도 있습니다.

+1

프로그램이 존재할 수도 있고 존재하지 않을 수도 있지만, 이론 상으로는 가능해야합니다. 컴파일러가 소스 코드를 바이트 코드로 변환하는 것과 마찬가지로 이론적으로 서로 다른 바이트 코드 버전을 서로 변환하는 컴파일러도 존재할 수 있습니다. – Toad

+1

reini : 실용적이라고 확신하지 않습니다. Java 6 검증 자에 대한이 문서를 참조하십시오 : https://jdk.dev.java.net/verifier.html 바이트 코드만으로 StackMapTable을 만들 수 있습니까? –

+0

아론 : "업데이트 1"을 참조하십시오. 그 명확성이 당신의 대답을 바꾸나요? – knorv