ASM之ClassWriter生成.class

ASM之ClassWriter生成.class

我们可以使用ClassWriter来生成一个类

如果不知道如何编写ASMified代码,可以直接使用插件ASMPlugin,将你需要的功能编写成正常的java代码,然后使用ASM Bytecode Viewer将编写的类转换成ASMified代码后作为参考

代码如下

package com.example.asmapplicationimport org.junit.Test
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.Opcodes
import java.io.File
import java.io.FileOutputStreamclass DemoASMGenerateClass {@Testfun generate(){val filePath = "E:\\Develop\\ASMApplication2\\app\\src\\test\\java\\com\\example\\asmapplication\\generate\\GenerateTest.class"val file = File(filePath)if (!file.parentFile.exists()){file.parentFile.mkdir()}//创建ClassWriterval cw = ClassWriter(ClassWriter.COMPUTE_FRAMES)//设定包名和类名cw.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"com/example/asmapplication/generate/GenerateTest",null,"java/lang/Object",null)//每个classFile都有一个<init>的初始化方法val mvInit = cw.visitMethod(Opcodes.ACC_PUBLIC,"<init>","()V",null,null)mvInit.visitCode()mvInit.visitVarInsn(Opcodes.ALOAD, 0)mvInit.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false)mvInit.visitInsn(Opcodes.RETURN)mvInit.visitMaxs(1, 1);mvInit.visitEnd()//创建一个test()方法val mvTest = cw.visitMethod(Opcodes.ACC_PUBLIC,"test","()V",null,null)mvTest.visitCode()//打印Hello WordmvTest.visitLdcInsn("Hello World!!!")mvTest.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")mvTest.visitInsn(Opcodes.SWAP)mvTest.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V", false)mvTest.visitInsn(Opcodes.RETURN)mvTest.visitMaxs(2, 1)mvTest.visitEnd()//类的访问结束cw.visitEnd()//输出为class文件val outputStream = FileOutputStream(file)outputStream.write(cw.toByteArray())outputStream.flush()outputStream.close()}
}

最终生成代码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.example.asmapplication.generate;public class GenerateTest {public GenerateTest() {}public void test() {System.out.println("Hello Word!!!");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器事件循环原理 —— 任务优先级

系列文章目录 第一章 浏览器事件循环原理 —— 浏览器进程模型第二章 浏览器事件循环原理 —— 渲染主线程如何工作&#xff1f;第三章 浏览器事件循环原理 —— 何为异步&#xff1f;第四章 浏览器事件循环原理 —— JS为何会阻碍渲染&#xff1f; 文章目录 系列文章目录 文…

C/C++杂谈-printf的可变参数机制

C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制&#xff0c;对模板参数进行了高度泛化&#xff0c;但是对于可变参数其实C语言学习中早已遇到过&#xff0c;那就是printf…

【Redis】持久化-RDBAOF混合持久化

文章目录 前置知识RDB&#xff08;定期备份&#xff09;触发机制流程说明RDB文件的处理RDB 的优缺点 AOF&#xff08;实时备份&#xff09;使用AOF命令写入AOF工作流程文件同步重写机制重写触发机制AOF进制重写流程 混合持久化启动时数据恢复 总结 前置知识 回顾MySQL MySQL的事…

LeetCode(28)盛最多水的容器【双指针】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 盛最多水的容器 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水…

云计算时代改变了什么?

当今云计算时代&#xff0c;计算资源和数据存储已经不再受限于本地设备的硬件和软件限制。云计算技术的发展和普及&#xff0c;使得用户可以通过互联网访问大量的计算资源和存储空间&#xff0c;从而改变了我们对计算和数据的看法。本文将探讨云计算时代对计算和数据处理的影响…

对线程的创建

一&#xff0c;概括 二&#xff0c;线程构建方式一&#xff08;继承Thread类&#xff09; 三&#xff0c;案例 父类&#xff1a; package Duoxiancheng;public abstract class Name {public static void main(String[] args) {//3&#xff0c;创建一个Thread线程类对象Thr…

汇编语言学习笔记

汇编语言的不同种类 as86汇编&#xff1a;能产生16位代码的Intel 8086汇编 mov ax, cs //cs→ax&#xff0c;目标操作数在前GNU as汇编&#xff1a;产生32位代码&#xff0c;使用AT&T系统V语法 movl var&#xff0c; %eax // var→%eax&#xff0c;目标操作数在后内嵌汇编…

Android异步之旅:探索AsyncTask

前言&#xff1a; 在Android应用程序开发中&#xff0c;异步操作是非常常见的需求。比如&#xff0c;我们可能需要在后台线程中执行网络请求、数据库操作或者其他耗时的任务&#xff0c;而不阻塞UI线程。为了实现这些异步操作&#xff0c;Android提供了多种方式&#xff0c;其…

基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

PostgreSQL序列,怎么才能第二天重新从1开始计数

--确定日期最大值和每天序列号最大值 with cte as(select (((1::bigint)<<32)-1) as max_date_second,(((1::bigint)<<31)-1) as max_sn )select max_date_second,to_timestamp(max_date_second),max_sn,((max_date_second<<31)|max_sn) as max_val,(((max_d…

Selenium 元素不能定位总结

目录 元素不能定位总结: 1、定位语法错误&#xff1a; 定位语法错误&#xff0c;如无效的xpath&#xff0c;css selector,dom路径错误&#xff0c;动态dom 定位语法错误&#xff0c;动态路径&#xff08;动态变化&#xff09; 定位策略错误&#xff0c;如dom没有id用id定位…

研发探索:导购APP、查券返利机器人与淘客系统,全面对比与选择

研发探究&#xff1a;导购APP、查券返利机器人与淘客系统&#xff0c;全面对比与选择 在互联网购物的时代&#xff0c;导购APP、淘客机器人和微赚淘客系统成为了消费者们的三大好帮手。它们各具优势&#xff0c;但也存在一些不足。本文将为您详细对比这三种工具&#xff0c;帮…

vue history路径编码

记录今天遇到的一个问题&#xff1a; 问题现状 有一个需要前端伪造302进行重定向的需求&#xff0c;我们需要将这样的一个路径&#xff1a;http://xxx.com/system-name/#/index&#xff0c;拼接在跳转地址的后面&#xff0c;进行重定向。拼接的方式是这样的&#xff1a; htt…

攻防世界-web-Confusion1

1. 题目描述 打开链接&#xff0c;如图 点击Login和Rigister&#xff0c;都报错 但是有提示 指出了flag所在的位置&#xff0c;题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置&#xff0c;那么要读取到这个文件&#xff0c;要么是任意文…

AI辅助带货直播场景源码系统 附带网站的搭建教程

互联网技术的发展和普及&#xff0c;直播带货行业迅速崛起。然而&#xff0c;直播带货在带来商机的同时&#xff0c;也面临着诸多挑战。如直播内容缺乏新意、转化率低等问题。针对这些问题&#xff0c;AI辅助带货直播场景源码系统应运而生&#xff0c;旨在利用人工智能技术&…

【高级渗透篇】网络安全面试

【高级渗透篇】网络安全面试 1.权限维持2.代码安全Python语法相关 1.权限维持 Linux权限维持方法论 Windows权限维持方法论 2.代码安全 Python 语法相关 1、Python的值类型和引用类型是哪些 Python 中的值类型包括&#xff1a; 数字类型&#xff08;如整数、浮点数、复数…

对接苹果支付退款退单接口

前言 一般而言&#xff0c;我们其实很少对接退款接口&#xff0c;因为退款基本都是商家自己决定后进行操作的&#xff0c;但是苹果比较特殊&#xff0c;用户可以直接向苹果发起退款请求&#xff0c;苹果觉得合理会退给用户&#xff0c;但是目前公司业务还是需要对接这个接口&am…

试试MyBatis-Plus可视化代码生成器,太香了,你一定会感谢我

前言 在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

【JavaSE】-5-嵌套循环

回顾 一、java语言特点 二、配置java环境 path 三、记事本 javac -d . java 包名.类名 四、eclipse 五、变量 定义变量 数据类型 变量名值; 六、相关的数据类型 ​ 基本&#xff08;四类 、8种&#xff09;、引用 ​ 类型转换&#xff08;自动、强制&#xff09; ​ 运…