2012-05-12 3 views
2

나는 byte[] 배열을 가지고 있는데, 이는 클래스 파일 내부의 메소드에 대한 바이트 코드 시퀀스라는 것을 알고있다. 이 byte[] 배열을 선택적으로 디 컴파일하는 몇 가지 방법이 있습니까? 실제 .class 파일에 액세스 할 수 없습니다. 많은 메소드 (javassist.bytecode.CodeAttribute 클래스)가있는 Javassist 라이브러리를 살펴 보았지만 그러한 특정 메소드를 찾을 수 없었습니다.
누구나 단서가 있습니까?바이트 코드 시퀀스 디 컴파일

byte[] 배열을 가져올 수 있으며 JVM 참조 설명서를 사용하여 실제 바이트 코드를 JavaByte 코드 니모닉으로 생성 할 수 있지만 디 컴파일 된 Java 소스 코드를 생성해야합니다. 감사합니다.

답변

3

한 가지 방법으로 바이트 코드를 다루는 것을 들어 본 적이 없습니다. 나는 네가 그걸 가지고 아무것도 할 수 없다는 것을 알게 될 것 같아. 어떤 바이트 코드가 있습니까? 너 어디서 났니? class file formathow methods are stored에 익숙하십니까? 예를 들어 name of a method은 전체 클래스 파일의 일부인 the constant pool에 저장되며 하나의 메소드가 아닙니다. 그 밖의 무엇이 있는지 알아 보려면 방법 형식에 대해 계속 읽으십시오. 나는 당신이 당신이 가지고 있다고 생각하는 것을 가지고 있지 않다는 것을 매우 강력하게 의심합니다. 그렇지 않으면 당신은 그것의 무엇이든을 만들기에 충분한 정보를 가지지 못할 것입니다.

면책 조항 : 나는 바이트 코드 조작 만 다뤄 보았으므로 내가 권위있는 것으로 생각하지 마십시오. 명세가 말하는 것을 믿으십시오.

+0

JPDA 메소드'com.sun.jdi.Method.bytecodes()'함수 호출에서 바이트 코드를 받았습니다. 나는 그 기능의 디 컴파일 된 버전을 표시 할 수 있도록 디 컴파일하려고합니다. 문제 (예 : 보호, 비공개, 정적 변수 등의 외부 참조)가있을 수 있음을 확인했습니다. 그러나 나는 그것을 디 컴파일하는 방법이 있기를 희망했다. 나는 바이트 코드로부터 디코딩 된 니모닉을 생성하는 자체 바이트 코드 디 컴파일 방법을 썼기 때문에 (필자는'javap'의 결과와 함께 그것을 검증했습니다) 유효한'바이트 []'배열에서 유효한 바이트 코드를 가지고 있습니다. – tr4nc3

+0

흥미 롭습니다. 음, 디 컴파일러가 밖에 있습니다. 프로그래밍 API를 제공하는 유일한 API는 [Java Decompiler] (http://java.decompiler.free.fr/)입니다. 나는 그것이 디 컴파일러가 입력 바이트 코드와 관련하여 얼마나 유연한 지에 달려 있다고 생각한다. JDI는 모르지만'com.sun.jdi.Method'를 사용하면 클래스를 나타내는 무언가를 만들고 더 많은 바이트 코드 정보를 얻을 수 있습니다. 아마도'method.declaringType()'과 같은 것이 될 것입니다.이 클래스는 [ClassType]을 제공합니다 (http://docs.oracle.com/javase/6/docs/jdk/api/jpda/jdi/com/sun/jdi/ ClassType.html)? –

+0

맞아요.'Method.declaringType()'은'ReferenceType' 객체만을 제공합니다. 해당 객체에서 바이트 코드를 가져올 메소드가 없습니다. 'sourcePath()'와'sourceName()'함수 호출이 있습니다. 소스 파일 이름을 얻을 수는 있지만 (그 소스가 있다고 가정합니다), 대부분의 경우가 아닐 수도 있습니다. 첫 번째 장소에서 디 컴파일러). JD-Eclipse 사용자가 프로그래밍 방식의 API를 제공하는지 확신 할 수 없습니다. 나는 그들이 이클립스를 가지고 있다고 믿는다. 또한 닫힌 소스이기 때문에 라이센스 당 허용되지 않는 릴리스 파일을 뒤집을 수 있습니다. – tr4nc3

2

모든 이름이 클래스 와이드 상수 풀에 저장되어 있기 때문에 특정 메서드의 바이트 코드 만 사용하여 유효한 Java 소스를 생성 할 수 없습니다. 당신이 바랄 수있는 최선의 방법은 바이트 코드 니모닉을 생성하는 것입니다.