• asm demo


    出处:https://blog.csdn.net/zhangjg_blog/article/details/22976929

    package com.gxf.asm;
    
    import org.objectweb.asm.ClassWriter;
    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;
    
    import java.io.FileOutputStream;
    
    /**
     * @Author: <guanxiangfei@meituan.com>
     * @Description:
     * @Date: Created in : 2018/8/19 下午6:15
     **/
    public class Helloworld extends ClassLoader implements Opcodes {
    
        public static void main(final String args[]) throws Exception {
    
    
            //定义一个叫做Example的类
            ClassWriter cw = new ClassWriter(0);
            cw.visit(V1_1, 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();
    
            //生成main方法
            mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
                    "main",
                    "([Ljava/lang/String;)V",
                    null,
                    null);
    
            //生成main方法中的字节码指令
            mw.visitFieldInsn(GETSTATIC,
                    "java/lang/System",
                    "out",
                    "Ljava/io/PrintStream;");
    
            mw.visitLdcInsn("Hello world!");
            mw.visitMethodInsn(INVOKEVIRTUAL,
                    "java/io/PrintStream",
                    "println",
                    "(Ljava/lang/String;)V");
            mw.visitInsn(RETURN);
            mw.visitMaxs(2, 2);
    
            //字节码生成完成
            mw.visitEnd();
    
            // 获取生成的class文件对应的二进制流
            byte[] code = cw.toByteArray();
    
    
            //将二进制流写到本地磁盘上
            FileOutputStream fos = new FileOutputStream("Example.class");
            fos.write(code);
            fos.close();
    
            //直接将二进制流加载到内存中
            Helloworld loader = new Helloworld();
            Class<?> exampleClass = loader.defineClass("Example", code, 0, code.length);
    
            //通过反射调用main方法
            exampleClass.getMethods()[0].invoke(null, new Object[] { null });
    
    
        }
    }

    生成了Example.class文件,通过classload加载到内存,通过反射调用main方法。整体还是很吊的,具体asm用法要看下博客和其他资料研究一下

  • 相关阅读:
    在MVC中更新ModelFirst Entity Framework POCO实体外键的方法
    美国行照片集十四:洛杉矶拉斯维加斯之旅
    深入ASP.NET MVC之三:Controller的激活
    美国行照片集之十三:感恩节之旅
    深入ASP.NET MVC 之一:IIS到路由表
    博客样式改版
    关于如何用string保存二进制数据的问题
    XSI IPC机制的优缺点
    C,C++,java,python对比
    grunt requireJS 的基础配置
  • 原文地址:https://www.cnblogs.com/luckygxf/p/9502073.html
Copyright © 2020-2023  润新知