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] 삭제
몇 마디 만하겠습니다