2009-10-12 4 views
15

종종 소스가없는 Java 클래스 파일로 인해 문제가 있음을 이해하려고합니다. 디 컴파일러는 유용하지만 모든 상황에서 충분하지Java 바이트 코드 이해

주 ...

나는이 두 가지 질문

도구 (리눅스 명령 줄에서 바람직 가능) 자바 바이트 코드를 볼 수 있습니다 무엇
  1. 자바 바이트 코드를 직접보고보다 자바 바이트 코드 구문을 잘 알고

답변

16

오히려 얻을 수있는 좋은 참조가 무엇

  • 하는 w Java 가상 머신 및 그 조작에 익숙해지기 위해서는 Java 디 컴파일 유틸리티를 사용해 볼 수 있습니다. 디 컴파일러는 지정된 class 파일에서 java 소스 파일을 만들려고 시도합니다.

    How do I “decompile” Java class files?은 Java class 파일을 디 컴파일하는 방법을 찾는 데 유익한 관련 질문입니다.

    즉, Java class 파일을 분해하기 위해 JDK의 일부인 javap 명령을 사용할 수 있습니다. javap의 출력은 class 파일에 포함 된 Java 바이트 코드입니다. 그러나 바이트 코드가 자바 소스 코드와 전혀 닮지 않았 음을 경고해야한다.

    Java 바이트 코드 및 Java 가상 머신 자체에 대해 학습 할 수있는 확실한 소스는 The Java Virtual Machine Specification, Second Edition입니다. 특히, Chapter 6: The Java Virtual Machine Instruction Set은 모든 바이트 코드 명령어들의 인덱스를 갖는다. 당신이 클래스없이 소스 코드를 가지고 있지만, 버그가있는 경우

  • +0

    디 컴파일러에 대한 내 의견을 참조하십시오. – hhafez

    +0

    @hhafez : "Java 바이트 코드 이해"질문에 답변이 되었습니까? 아닙니다. –

    1

    , 당신은 두 가지 기본 가지 중 하나를 수행 할 수 있습니다

    1. 디 컴파일, 버그를 수정하고 jar 파일을 다시 작성하십시오. 이전에이 작업을 수행했지만 시스템 관리자는이를 프로덕션 환경에 적용하는 것에 대해 경의를 표합니다.
    2. 클래스의 단위 테스트를 작성하고, 버그의 원인을 판별하고, 단위 테스트로 버그를보고하고 수정 될 때까지 기다립니다.

      (2)는 일반적으로 시스템 관리자가 선호하는 것입니다.

      버그가 발생한 원인을 알고 있기 때문에 (2)와 함께 간다면, 문제를 방지하기 위해 입력을 클래스에 허용하지 않거나 올바르게 처리 할 준비를 할 수 있습니다 오류가 발생하면

      AspectJ를 사용하여 문제 클래스에 코드를 삽입하고 실제로 다시 컴파일하지 않고도 메서드의 동작을 변경할 수 있습니다. 모든 사람들에게 문제를 가르치지 않고 걱정할 필요없이 함수를 호출 할 수있는 모든 코드에 대해이를 변경할 수 있으므로 이것이 바람직한 옵션이라고 생각합니다.

      바이트 코드 지침을 읽으려면이 문제를 해결하기 위해 무엇을 할 것입니까?

    +0

    1. .class에 코드를 삽입하기 위해 AspectJ를 사용할 수 있는지 모르겠다. 자바에서 작동한다고 생각했지만, 내가 틀렸다고 생각한다. 2. 문제를 파악할 때 나는 무엇을 할 것인가? 여러 번 문제가 실제로 무엇이 문제를 해결할 수 있는지를 알아내는 것입니다. – hhafez

    +0

    @hhafez - 클래스에 aspect의 런타임 weaving을 할 수 있지만, 그렇게 할 때 라이센스를 위반할 수 있습니다. 따라서 조금주의하십시오. 단위 테스트가 최선의 방법 일 수 있지만 코드를 테스트 할 수없는 경우 디 컴파일은 옵션이되지만 느린 프로세스 인 IMO입니다. –

    0

    나는이 두 가지 질문 도구가와 (자바 바이트 리눅스 명령 줄에서 바람직하게 사용할 수 코드 ( )

    javap 도구를 볼 수 있습니다 무엇

    1) -c 옵션) 바이트 코드 파일을 디스 어셈블합니다. 명령 줄에서 실행되며 Java SDK의 일부로 제공됩니다. 자바 바이트 코드 구문에 익숙해 좋은 참조가 무엇

    2)

    javap 도구는 JVM 사양에 사용되는 동일한 구문을 사용하고, JVM 스펙은 자연적으로 최종 소스 . 빌 베너 (Bill Venners)의 "Java 가상 머신 내부"에 대해서도 알아 보았습니다. 나는 결코 그것을 읽지 못했고, 절판 된 것처럼 보입니다.

    실제 (텍스트) 구문은 간단하고 자명합니다 ... 바이트 코드가하는 일을 설명하고이 레벨에서 코드 읽기에 대해 어느 정도 익숙하다고 가정하면. 그러나 바이트 코드가 난독 화기를 통해 공급 된 경우에도 디 컴파일러의 출력을 읽는 것이 더 쉬울 수 있습니다.

    14

    클래스 파일의 바이트 코드 명령을 보려면 Java 프로그램을 실행하고 클래스 경로 (필요한 경우) 및 클래스 이름을 지정하는 것과 같은 방법으로 javap -v 명령을 사용하십시오.

    예 : 읽기 가능한 자바 코드 대신에 바이트 코드 클래스를 컴파일 있도록

    바이트 코드 명령어 세트에 대한
    javap -v com.company.package.MainClass 
    

    , Instruction Set Summary

    +1

    이 답변은 원래 질문의 두 측면을 모두 포함합니다. – CyberMJ

    2

    Fernflower가 분석 디 컴파일러이다. 코드가 작동하는 방식을 이해하고자 할 때 훨씬 더 유용합니다.

    0

    당신은 이클립스 바이트 코드 개요 유용한 플러그인을 찾을 수 있습니다 : 내가 나 자신을 사용하지 않은

    http://andrei.gmxhome.de/bytecode/index.html

    - 그냥 통과에 언급 된 본.