初识ASM,简单的HelloWord

简介: 今天看到一个很有趣的ASM+Spring的应用写法.可以根据接口定义自动生成具体的Dao.主要还是ASM不熟悉.

今天看到一个很有趣的ASM+Spring的应用写法.可以根据接口定义自动生成具体的Dao.主要还是ASM不熟悉.所以决定从基础看起来.比如我要定义个类:

public class Example
{
    
    public void Hello(String str)
    {
        System.out.println("Hello world! " + str);
    }
}


如果我要定义一个ASM动态生成则:

 

 public static void main(final String args[]) throws Exception
    {
        
        /*
         * 如果我要生成一个如下的java代码:
         * 
         *     public void Hello(String str)
         *          {
         *        System.out.println("Hello world! " + str);
         *        }
         */
        
        // 定义ClassWriter 准备写类  
        ClassWriter cw = new ClassWriter(0);
        cw.visit(V1_6, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
        
        // 创建默认构造函数
        MethodVisitor mw = cw.visitMethod(ACC_PUBLIC,
            "<init>",
            "()V",
            null,
            null);
        
        mw.visitVarInsn(ALOAD, 0);
        mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mw.visitInsn(RETURN);
        mw.visitMaxs(1, 1);
        mw.visitEnd();
        
        //创建Hello方法 ,形参是 String
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,
            "Hello",
            "(Ljava/lang/String;)V",
            null,
            null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(12, l0);
        mv.visitFieldInsn(GETSTATIC,
            "java/lang/System",
            "out",
            "Ljava/io/PrintStream;");
        mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
        mv.visitInsn(DUP);
        mv.visitLdcInsn("Hello world! ");
        mv.visitMethodInsn(INVOKESPECIAL,
            "java/lang/StringBuffer",
            "<init>",
            "(Ljava/lang/String;)V");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL,
            "java/lang/StringBuffer",
            "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
        mv.visitMethodInsn(INVOKEVIRTUAL,
            "java/lang/StringBuffer",
            "toString",
            "()Ljava/lang/String;");
        mv.visitMethodInsn(INVOKEVIRTUAL,
            "java/io/PrintStream",
            "println",
            "(Ljava/lang/String;)V");
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(13, l1);
        mv.visitInsn(RETURN);
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "Lcom/test/Example;", null, l0, l2, 0);
        mv.visitLocalVariable("str", "Ljava/lang/String;", null, l0, l2, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
        
        /*
         * 写入文件
         */
        byte[] code = cw.toByteArray();
        FileOutputStream fos = new FileOutputStream("Example.class");
        fos.write(code);
        fos.close();
        
        /*
         * 从文件加载类
         */
        HelloWord loader = new HelloWord();
        Class exampleClass = loader.defineClass("Example", code, 0, code.length);
        
        /*
         * 反射生成类,并传入参数
         */
        Object obj = exampleClass.getConstructor(null).newInstance(null);
        exampleClass.getMethod("Hello", new Class[] {String.class})
            .invoke(obj, new Object[] {"zjy"});
        
    }


 

最后输出就

 Hello world! zjy

 

 

 

 

 

 

 

目录
相关文章
|
存储 数据采集 机器学习/深度学习
谷歌大数据的三驾马车
当涉及到大规模数据处理时,谷歌公司一直是领先的技术创新者,已经在大数据技术方面有着非常强的实力。下面我将详细介绍谷歌的三项重要技术:Google Bigtable,Google MapReduce和Google File System (GFS)。
2537 1
谷歌大数据的三驾马车
|
NoSQL Java MongoDB
Java对MongoDB的ObjectId的序列化问题
MongoDB在不特殊指认的情况下,默认的集合主键是“_id”,类型是ObjectId。ObjectId是一个12字节的BSON类型字符串,包含了UNIX时间戳,机器识别码,进程号,计数值信息。
4664 0
|
Java easyexcel
Java:SpringBoot使用EasyExcel实现Excel文件的导出下载和上传导入功能
Java:SpringBoot使用EasyExcel实现Excel文件的导出下载和上传导入功能
1050 0
Java:SpringBoot使用EasyExcel实现Excel文件的导出下载和上传导入功能
|
8月前
|
存储 Java API
SpringBoot整合Flowable【02】- 整合初体验
本文介绍了如何基于Flowable 6.8.1版本搭建工作流项目。首先,根据JDK和Spring Boot版本选择合适的Flowable版本(7.0以下)。接着,通过创建Spring Boot项目并配置依赖,包括Flowable核心依赖、数据库连接等。然后,建立数据库并配置数据源,确保Flowable能自动生成所需的表结构。最后,启动项目测试,确认Flowable成功创建了79张表。文中还简要介绍了这些表的分类和常用表的作用,帮助初学者理解Flowable的工作原理。
1597 0
SpringBoot整合Flowable【02】- 整合初体验
|
easyexcel
easyExcel自定定义类型转换
easyExcel自定定义类型转换
608 0
|
XML Java 数据库
springboot集成flowable
springboot集成flowable
hutool excel写数据
hutool excel写数据
179 1
|
缓存 前端开发 Java
汇编语言简介
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
|
存储 Java 测试技术
迄今为止最完整的DDD实践
对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战。
22858 8
|
SQL Java Go
Gerrit使用教程
Gerrit使用教程
2025 0
Gerrit使用教程