gpt4 book ai didi

Java ASM 需要帮助

转载 作者:行者123 更新时间:2023-12-02 02:13:27 24 4
gpt4 key购买 nike

我使用 Java ASM 编写了一个简单的程序来生成通过编译以下类生成的字节码。

public class Main {
public static void main(String[] args) {
System.out.println("Test");
}
}

下面给出了我编写的为此类生成字节码的代码。

public class CodeGenerator {

public void generateClass()
{
ClassWriter cw=new ClassWriter(Opcodes.NULL);
FieldVisitor fv;
MethodVisitor mv;
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Main", null, "java/lang/Object", null);
mv=cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitVarInsn(Opcodes.AALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
mv=cw.visitMethod(Opcodes.ACC_PUBLIC+ Opcodes.ACC_STATIC, "Main", "([Ljava/lang/String;)V", null, null);
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream");
mv.visitLdcInsn("Test");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(2, 1);
mv.visitEnd();
cw.visitEnd();
this.WriteClass(cw);
}
public void WriteClass(ClassWriter cw){
FileOutputStream fos;
try{
fos = new FileOutputStream("E:\\Acadamic\\Final year project\\ASM\\Main.class");
fos.write(cw.toByteArray());
fos.close();
}
catch (IOException ex){
Logger.getLogger(CodeGenerator.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

编译成功,当我尝试运行它时,出现以下错误。

Exception in thread "main" java.lang.NoClassDefFoundError: main/class
Caused by: java.lang.ClassNotFoundException: main.class
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: main.class. Program will exit.

任何人都可以帮助我避免此错误。如果有人可以解释错误的原因以及如何避免它,请善意地帮助我。

谢谢。

后续:

当我像 java Main 一样运行它时,会出现以下错误。

Exception in thread "main" java.lang.ClassFormatError: Field "out" in class Main
has illegal signature "Ljava/io/PrintStream"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: Main. Program will exit.

最佳答案

我认为您的错误不是由 ASM 引起的。看来您只是错误地调用了 java 。你应该这样调用它:

java Main

My guess is that you called it like this:

java Main.class

Update

There are three problems with your code.

Problem #1

The ClassWriter constructor accepts a bit mask of options. You passed it Opcodes.NULL. Although this may seem correct, you actually want to pass it 0 (Opcodes.NULL means something different).

ClassWriter cw=new ClassWriter(0);

问题#2

您正在构造函数中调用 AALOAD,而不是 ALOADAALOAD 指令加载数组元素,而ALOAD 加载局部变量

mv.visitVarInsn(Opcodes.ALOAD, 0);

问题#3

在您的Main方法中,您忘记了Ljava/io/PrintStream后面的分号:

mv.visitFieldInsn(
Opcodes.GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;" // Notice the semicolon
);

您可以通过利用 ASM 的 Type 类来减轻自己的痛苦:

mv.visitFieldInsn(
Opcodes.GETSTATIC,
"java/lang/System",
"out",
Type.getObjectType("java/io/PrintStream").getDescriptor()
);

关于Java ASM 需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4853767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com