当前位置: 首页 > 面试题库 >

产生一个“你好,世界!” Java ASM库创建类

慕乐语
2023-03-14
问题内容

我已经开始为正在处理的编译器项目弄乱ASM API。但是,我发现许多地方的文档对于新手来说还不够清楚,我认为有一个很好的可靠示例来生成仅打印“
Hello,World!”的类。这将是一个很好的例子。

目前,我可以使用main()生成一个类(使用ClassWriter,ClassVisitor和MethodVisitor类),但是我似乎无法弄清楚如何生成main的主体。谁能给我一个在ASM中生成类文件的示例:

  • 包含一个main()
  • 在main()中创建一个本地String变量,其值为“ Hello,World!”。
  • 打印变量

问题答案:

您可以使用java编译一个类,然后获取asm打印出生成等效类所需的调用,

常问问题

ASMifierClassVisitor

ASMifierClassVisitor javadocs实际上包含了hello world代码,

import org.objectweb.asm.*;

public class HelloDump implements Opcodes {

  public static byte[] dump() throws Exception {

     ClassWriter cw = new ClassWriter(0);
     FieldVisitor fv;
     MethodVisitor mv;
     AnnotationVisitor av0;

     cw.visit(49,
             ACC_PUBLIC + ACC_SUPER,
             "Hello",
             null,
             "java/lang/Object",
             null);

     cw.visitSource("Hello.java", null);

     {
         mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
         mv.visitVarInsn(ALOAD, 0);
         mv.visitMethodInsn(INVOKESPECIAL,
                 "java/lang/Object",
                 "<init>",
                 "()V");
         mv.visitInsn(RETURN);
         mv.visitMaxs(1, 1);
         mv.visitEnd();
     }
     {
         mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
                 "main",
                 "([Ljava/lang/String;)V",
                 null,
                 null);
         mv.visitFieldInsn(GETSTATIC,
                 "java/lang/System",
                 "out",
                 "Ljava/io/PrintStream;");
         mv.visitLdcInsn("hello");
         mv.visitMethodInsn(INVOKEVIRTUAL,
                 "java/io/PrintStream",
                 "println",
                 "(Ljava/lang/String;)V");
         mv.visitInsn(RETURN);
         mv.visitMaxs(2, 1);
         mv.visitEnd();
     }
     cw.visitEnd();

     return cw.toByteArray();
  }
}


 类似资料:
  • 本文向大家介绍TypeScript 你好,世界,包括了TypeScript 你好,世界的使用技巧和注意事项,需要的朋友参考一下 示例 这里我们有一个类 Greeter,它有一个构造函数和一个 greet 方法。我们可以使用 new 关键字构造一个类的实例,然后传入一个字符串,我们希望 greet 方法输出到控制台。Greeter 类的实例存储在 Greeter 变量中,然后我们调用 greet 方

  • 本文向大家介绍qml 你好,世界,包括了qml 你好,世界的使用技巧和注意事项,需要的朋友参考一下 示例 一个简单的应用程序在窗口中心显示文本“ Hello World”。            

  • 本文向大家介绍xaml 你好,世界,包括了xaml 你好,世界的使用技巧和注意事项,需要的朋友参考一下 示例 这是WPF中XAML页面的简单示例。它由XAML中最常见的元素a Grid,aTextBlock和aButton组成。 语法 描述 <Window> 根容器,用于承载可视化数据并使用户能够与之交互的内容。WPF窗口是XAML(.xaml)文件(其中元素为根)和CodeBehind(.cs)

  • 本文向大家介绍processing 你好,世界,包括了processing 你好,世界的使用技巧和注意事项,需要的朋友参考一下 示例 编写处理代码的最简单方法是简单地调用一系列函数。在处理编辑器中按运行按钮,处理将运行您的代码。这是一个例子: 此代码创建一个200x200窗口,绘制一个蓝色背景,将填充颜色更改为绿色,然后在屏幕中间绘制一个圆圈。 但是,大多数处理草图将使用预定义的setup()和d

  • 本文向大家介绍F# 你好,世界!,包括了F# 你好,世界!的使用技巧和注意事项,需要的朋友参考一下 示例 这是一个简单的控制台项目的代码,该项目显示“ Hello,World!”。到STDOUT,然后退出代码为0 逐行细分示例: [<EntryPoint>] -.net属性,用于标记程序(源)的“用于设置入口点的方法”。 let main argv-这定义了main一个由单个参数调用的函数argv

  • 本文向大家介绍sapui5 你好,世界!,包括了sapui5 你好,世界!的使用技巧和注意事项,需要的朋友参考一下 示例 我们首先为应用创建HTML页面。在那里,我们定义了元标记,用于加载SAPUI5库的脚本标记以及用于应用程序内容的占位符。 根据您的安装调整资源所在的路径(<>:<>)。对于OpenUI5,您可以使用src =“ https://openui5.hana.ondemand.com