단순 클래스 파일 생성시 메서드 서명에 대한 잘못된 상수 풀 인덱스

루카스

Java Bytecode를 생성하는 간단한 컴파일러를 만들고 싶습니다. 코드 생성을 위해 Apache BCEL 라이브러리를 사용하고 있습니다.

그러나 아무것도하지 않는 주 메서드로 간단한 클래스를 만드는 데 실패했습니다. 클래스 파일을 생성하기 위해 다음 코드를 사용합니다 (스칼라라는 것을 알고 있지만 나중에 보게 되겠지만 그다지 중요하지 않습니다).

private def generateClassFile(): Unit =
{
    // JVM tutorial: https://commons.apache.org/proper/commons-bcel/manual/jvm.html
    val interfaces: Array[String] = new Array(0);
    classFactory = new ClassGen(
        "MiniPascal",
        "java.lang.Object",
        null,
        Const.ACC_PUBLIC | Const.ACC_SUPER,
        interfaces
    );

    val mainConstantPool: ConstantPoolGen = new ConstantPoolGen();
    val mainMethod = generateMainMethod(mainConstantPool);
    classFactory.addMethod(mainMethod.getMethod());
}

private def generateMainMethod(mainConstantPool): MethodGen =
{
    val instructions = new InstructionList();
    instructions.append(InstructionConstants.NOP);

    mainConstantPool.addNameAndType("main", "([java/lang/String;)V");

    val methodArgumentNames = Array("args");
    val methodArgumentTypes: Array[Type] = Array(new ArrayType(Type.STRING, 1));
    val mainMethod: MethodGen = new MethodGen(
        Const.ACC_PUBLIC | Const.ACC_STATIC,
        Type.VOID,
        methodArgumentTypes,
        methodArgumentNames,
        "main", "MiniPascal",
        instructions,
        mainConstantPool
    );

    return mainMethod;
}

private def saveClassFile(): Unit =
{
    val classFile: JavaClass = classFactory.getJavaClass();
    classFile.dump("MiniPascal.class");
    //println(classFile.toString());
}

프로그램을 실행할 때 클래스 파일이 생성되지만 실행할 때 java MiniPascal다음 예외가 발생합니다.

java.lang.ClassFormatError: Illegal constant pool index 4 for method signature in class file MiniPascal

Java Bytecode에 대해 읽고 상수 풀이 클래스 파일 내용의 약 60 %이고 모든 리터럴의 이름을 저장한다는 것을 알고 있지만 아직 예외의 경우를 파악하지 못했습니다.

나는 당신의 제안을 기다리고 있습니다. 당신의 도움을 주셔서 감사합니다!

어윈 볼 위트

다음 줄을 사용하여 클래스와 연결하지 않는 자체 빈 상수 풀을 만듭니다.

val mainConstantPool: ConstantPoolGen = new ConstantPoolGen();

따라서 메서드 시그니처를 상수 풀에 추가하더라도 상수 풀이 클래스 파일에 추가되지 않기 때문에 작동하지 않습니다.

어느 먼저 상수 풀을 생성하고에 전달할 ClassGen마지막 인자로 생성자, 또는 초기화 mainConstantPool에서 classFactory.getConstantPool().

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클래스 파일 상수 풀 (javap)의 메소드 서명 및 설명자

분류에서Dev

개인 파생 클래스가있는 추상 클래스 : 일부에 대한 메서드 구현

분류에서Dev

일반 기본 클래스에서 파생 된 모든 클래스에 대한 메서드

분류에서Dev

기본 클래스 포인터가 파생 클래스의 재정의 된 메서드 대신 기본 클래스의 순수 가상 메서드를 가리키는 이유는 무엇입니까?

분류에서Dev

간단한 트리 탑 파서에서 날짜 부분 가져 오기 : 잘못된 인수 유형 클래스 (예상 모듈)

분류에서Dev

"오류 : 단일 덱스 파일 요청 클래스 (# 방법 : 66653> 65536)에 맞게 할 수 없습니다"서명 된 APK를 생성 할 때

분류에서Dev

최적화 (재 컴파일)는 각 파생 클래스에 대한 가상 메서드를 상속합니다.

분류에서Dev

Raku에서 동일한 파일에 정의 된 클래스에서 메서드 특성을 상속 할 수 없습니다.

분류에서Dev

C ++ 11 : 순서가 잘못된 인스턴스 멤버 초기화에 대한 일관성없는 경고

분류에서Dev

추상 클래스에서 파생 된 클래스 생성자

분류에서Dev

QPixmap 파생 클래스에 대해 스케일링 된 메서드를 포함 할 수 있습니까?

분류에서Dev

상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

분류에서Dev

에 대한 최상의 오버로드 된 메서드 일치에 잘못된 인수가 있습니다.

분류에서Dev

C ++ 상속 : 기본 클래스에 대한 파생 클래스 포인터가 파생 클래스 메서드를 호출합니다.

분류에서Dev

일반 클래스의 생성자에 잘못된 인수가 있습니다.

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

클래스 메서드 및 속성에 대한 명명 규칙

분류에서Dev

추상 클래스 B에서 파생 된 클래스 A의 단위 테스트

분류에서Dev

JAR 파일을 생성 한 후 명령 줄에서 '오류 : 메인 클래스 ExampleProgram을 찾거나로드 할 수 없음'을 반환합니까?

분류에서Dev

Scala에서 단순 클래스에 대한 copy () 메서드를 작성하는 방법

분류에서Dev

균일 한 데이터에 대한 최대 풀에서 인덱스 추출

분류에서Dev

클래스 생성자에 함수 포인터를 설정하는 중 ... '&': 바운드 멤버 함수 표현식에 대한 잘못된 연산

분류에서Dev

"시뮬레이션 된 메서드 중단 점에 대한 처리 클래스"창을 숨 깁니다. 생각

분류에서Dev

Domino Designer에서 Java 코드에 대해 생성 된 클래스 파일을 어떻게 볼 수 있습니까?

분류에서Dev

C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

분류에서Dev

Windows WSL Ubuntu에서 탑재 된 디스크의 파일에 대한 잘못된 권한이 표시됨

분류에서Dev

babel로 트랜스 파일 된 es2015 클래스 메서드에 대한 재귀 메서드 호출

분류에서Dev

octopress 생성에서 CSS 파일에 대한 잘못된 경로

Related 관련 기사

  1. 1

    클래스 파일 상수 풀 (javap)의 메소드 서명 및 설명자

  2. 2

    개인 파생 클래스가있는 추상 클래스 : 일부에 대한 메서드 구현

  3. 3

    일반 기본 클래스에서 파생 된 모든 클래스에 대한 메서드

  4. 4

    기본 클래스 포인터가 파생 클래스의 재정의 된 메서드 대신 기본 클래스의 순수 가상 메서드를 가리키는 이유는 무엇입니까?

  5. 5

    간단한 트리 탑 파서에서 날짜 부분 가져 오기 : 잘못된 인수 유형 클래스 (예상 모듈)

  6. 6

    "오류 : 단일 덱스 파일 요청 클래스 (# 방법 : 66653> 65536)에 맞게 할 수 없습니다"서명 된 APK를 생성 할 때

  7. 7

    최적화 (재 컴파일)는 각 파생 클래스에 대한 가상 메서드를 상속합니다.

  8. 8

    Raku에서 동일한 파일에 정의 된 클래스에서 메서드 특성을 상속 할 수 없습니다.

  9. 9

    C ++ 11 : 순서가 잘못된 인스턴스 멤버 초기화에 대한 일관성없는 경고

  10. 10

    추상 클래스에서 파생 된 클래스 생성자

  11. 11

    QPixmap 파생 클래스에 대해 스케일링 된 메서드를 포함 할 수 있습니까?

  12. 12

    상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

  13. 13

    에 대한 최상의 오버로드 된 메서드 일치에 잘못된 인수가 있습니다.

  14. 14

    C ++ 상속 : 기본 클래스에 대한 파생 클래스 포인터가 파생 클래스 메서드를 호출합니다.

  15. 15

    일반 클래스의 생성자에 잘못된 인수가 있습니다.

  16. 16

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  17. 17

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  18. 18

    클래스 메서드 및 속성에 대한 명명 규칙

  19. 19

    추상 클래스 B에서 파생 된 클래스 A의 단위 테스트

  20. 20

    JAR 파일을 생성 한 후 명령 줄에서 '오류 : 메인 클래스 ExampleProgram을 찾거나로드 할 수 없음'을 반환합니까?

  21. 21

    Scala에서 단순 클래스에 대한 copy () 메서드를 작성하는 방법

  22. 22

    균일 한 데이터에 대한 최대 풀에서 인덱스 추출

  23. 23

    클래스 생성자에 함수 포인터를 설정하는 중 ... '&': 바운드 멤버 함수 표현식에 대한 잘못된 연산

  24. 24

    "시뮬레이션 된 메서드 중단 점에 대한 처리 클래스"창을 숨 깁니다. 생각

  25. 25

    Domino Designer에서 Java 코드에 대해 생성 된 클래스 파일을 어떻게 볼 수 있습니까?

  26. 26

    C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

  27. 27

    Windows WSL Ubuntu에서 탑재 된 디스크의 파일에 대한 잘못된 권한이 표시됨

  28. 28

    babel로 트랜스 파일 된 es2015 클래스 메서드에 대한 재귀 메서드 호출

  29. 29

    octopress 생성에서 CSS 파일에 대한 잘못된 경로

뜨겁다태그

보관