Javassist讲解1(介绍,读写字节码)

Javassist讲解1(介绍,读写字节码)

  • 介绍
  • 一、读写字节码
    • 1.如何创建新的类
    • 2.类冻结


介绍

    javassist 使Java字节码操作变得简单,它是一个用于在Java中编辑字节码的类库;

    它使Java程序能够在运行时定义一个新类,并在JVM加载类文件时对其进行修改

    与其他类似的字节码编辑器不同,javassist提供了两个级别的API:

    源代码级别和字节码级别

    如果用户使用源级API,他们可以在不了解Java字节码规范的情况下编辑类文件。整个API仅使用Java语言的词汇设计,甚至可以以源代码的形式指定插入的字节码,Javassist会即时的进行编译。

    另一方面,字节级API允许用户像其他编辑器一样直接编辑类文件



一、读写字节码

    javassist是一个用于处理Java的字节码的类库。Java字节码存储在成为类文件的二进制文件中。每个类文件都包含一个Java类或接口

	//获取Class池ClassPool pool = ClassPool.getDefault();//获取CtClassCtClass cc = pool.get("net.mooctest.Yest");//修改字节码cc.setSuperclass(pool.get("net.mooctest.YestFather"));//输出字节码cc.writeFile("D:\\桌面\\pair\\PairHeap2\\result1666497514964\\target\\classes");

  • 首先获取一个ClassPool对象,该对象控制使用Javassist修改字节码,ClassPool是一个表示类文件的对象容器
  • ClassPool 是本质一个CtClass 对象的map,使用类名作为键,调用get方法,搜索整个ClassPool,如果没有找到对应的对象,就新构造一个CtClass类对象,该对象被记录在map中,但是注意,这里说得是加载的对象,如果类名对应类不存在,会抛出异常
  • 获取到ClassPool对象后,就可以进行修改,这里的话讲其父类修改为了BaseObj,然后是cc.writeFile(),可以将修改后的字节码进行保存,也可以直接通过toBytecode()获取字节码

最后看到Class文件中可以发现本来没有继承的Yest类成功继承了YestFather类


在这里插入图片描述

1.如何创建新的类

  • ClassPool的makeClass方法可以帮助我们定义一个新的不存在的类
  • 但是makeClass()不能创建接口,创建接口需要调用makeInterface方法

	ClassPool pool = ClassPool.getDefault();CtClass cc = pool.makeClass("net.mooctest.NewClass");cc.writeFile("D:\\桌面\\pair\\PairHeap2\\result1666497514964\\target\\classes");

可以看到成功创建了一个NewClass类

在这里插入图片描述

2.类冻结

  • 执行了writeFile 或者 toBytecode() 等输出字节码的方法之后,CtClass就处于了冻结的状态,在此状态下不允许修改。

	ClassPool pool = ClassPool.getDefault();CtClass cc = pool.makeClass("net.mooctest.Yest");cc.writeFile("D:\\桌面\\pair\\PairHeap2\\result1666497514964\\target\\classes");cc.setSuperclass(pool.get("net.mooctest.YestFather"));如果在输出之后修改再次修改:>>>>>>>>Exception in thread "main" java.lang.RuntimeException:net.mooctest.Yest class is frozen

  • CtClass 调用 defrost 可以解冻,变为可修改的状态
  • 当 ClassPool.doPruning 属性设置为 true 的时候 ,冻结的类不能再次被解冻

	ClassPool pool = ClassPool.getDefault();ClassPool.doPruning = true;调用解冻会提示:dofrost(): net.mooctest.Yest was pruned

  • doPruning 属性设置为 true ,某一个特定类需要解冻的时候,可以提前调用,这样就不会报错

	CtClass cc = pool.makeClass("net.mooctest.Yest");cc.stopPruning(true);

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

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

相关文章

6-3 求二叉树的高度 分数 10

int Depth(BiTree Tree) {if (!Tree)return 0;return Depth(Tree->lchild) > Depth(Tree->rchild) ? Depth(Tree->lchild) 1 : Depth(Tree->rchild) 1; }

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件:上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振, 49_999_999 是 1秒…

apk反编译修改教程系列---简单去除apk联网权限 其他权限 无法自动更新等【四】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 目前基本所有的apk都有联网设…

Zynq UltraScale+ XCZU5EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

分布式消息队列:Rabbitmq(2)

目录 一:交换机 1:Direct交换机 1.1生产者端代码: 1.2:消费者端代码: 2:Topic主题交换机 2.1:生产者代码: 2.2:消费者代码: 二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间 2.2:死信队列 一:交换机 1:Direct交…

macOS 创建Flutter项目

参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档,配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter,验证 F…

云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

南京长江大桥是中国第一座自主设计建造的双层公路铁路桥,也是世界上最早的双层公路铁路桥之一。它不仅是一座桥梁,更是一座历史文化的见证者和传承者。它见证了中国人民的智慧和奋斗,承载了中国社会的变迁和发展。 如何让这座不可移动的文物…

FreeRTOS_信号量之互斥信号量

目录 1. 互斥信号量 1.1 互斥信号量简介 1.2 创建互斥信号量 1.2.1 函数 xSemaphoreCreateMutex() 1.2.2 函数 xSemaphoreCreateMutexStatic() 1.2.3 互斥信号量创建过程分析 1.2.4 释放互斥信号量 1.2.5 获取互斥信号量 2. 互斥信号量操作实验 2.1 实验程序 2.1.1 …

Linux:文件操作

目录 一、关于文件 1、文件类的系统接口 2、文件的含义 二、文件操作 1、C语言文件相关接口 2、系统接口 open close write read 三、文件描述符 关于fd fd的分配规则 输出重定向示例 输入重定向示例 追加重定向示例 dup2函数 缓冲区 stdout与stderr perror…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…

数据结构:算法(特性,时间复杂度,空间复杂度)

目录 1.算法的概念2.算法的特性1.有穷性2.确定性3.可行性4.输入5.输出 3.好算法的特质1.正确性2.可读性3.健壮性4.高效率与低存储需求 4.算法的时间复杂度1.事后统计的问题2.复杂度表示的计算1.加法规则2.乘法规则3.常见函数数量级比较 5.算法的空间复杂度1.程序的内存需求2.例…

5.3 用户定义的完整性

思维导图: 5.3 用户定义的完整性 用户定义的完整性是确保数据库中的数据满足特定应用的语义要求。这是通过关系数据库管理系统(RDBMS)中的内置机制来完成的,不需要依赖应用程序来执行。 5.3.1 属性上的约束条件 1. 定义属性上的约束条件 当在CREATE T…

centos7安装oxidized备份软件

首先需要提前下载ruby,因为默认yum安装的版本太低 https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz 1、yum remove ruby ruby-devel(有就卸载,没有则忽略) 2、将下载好的ruby包解压到/opt下 [rootoxidized ruby-…

Python---字符串输入和输出---input()、格式化输出:%,f形式,format形式

字符串输入: 在Python代码中,我们可以使用input()方法来接收用户的输入信息。记住:在Python中,input()方法返回的结果是一个字符串类型的数据。 如果之后使用输入的数据,一定要记得利用数据类型转换。 相关链接:Pyt…

nodejs升级或降级

node有一个模块叫n,是专门用来管理node.js的版本。 升级或降级步骤 1 、安装n模块 npm install -g n 2、 升级node.js到最新稳定版 n stable Ps: n后面也可以跟随版本号(用于升级或降级)比如: n v16.12.0

蚂蚁SOFA Stack融合大模型发布升级版 将为机构产研效能提升30%

11月1日,在云栖大会上,蚂蚁集团正式发布CodeFuse全面加持的SOFAStack5.0升级版本,向企业提供全方位研发运维智能助手相关能力。这是继蚂蚁集团在外滩大会发布代码大模型CodeFuse之后,首次公布面向行业的商业化产品进展。 “大模型…

Controllable Guide-Space for Generalizable Face Forgery Detection

一、研究背景 以往工作专注于提取伪造特征的共同特性和真假域鉴别性信息,以提升特征泛化性。 但在训练过程中,这些方法只区分真假域,并将不同的伪造域看作一类而不加以区分。 这会导致伪造样本进一步以伪造不相关特征(如&#xff…

ACID模型

ACID 是数据库管理系统(DBMS)中用来确保事务处理正确性和可靠性的四个特性的首字母缩写。ACID 是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性&#xff08…

如何通过 NAT 模式连接VMware虚拟机以及存在和不存在ens33文件的解决方案

文章目录 前言1 VMware配置1.1 打开vmvare虚拟网络编辑器1.2 取消使用本地DHCP1.3 NAT设置 2 虚拟机的配置2.1 存在ens332.2.1 修改ifcfg-ens33文件2.2.1.1 为什么设置BOOTPROTOstatic?2.2.1.2 如何选择使用static还是dhcp? 2.2.2 关闭防火墙 2.2 不存在…

VScode clangd 插件浏览 linux 源码

文章目录 VScode clangd 插件浏览 linux 源码clangd 安装与配置VScode 插件安装clangd 安装方法一方法二 clangd 配置 cmake 生成bear 生成 compile_commands.json触发 clangd linux 内核脚本生成 compile_commands.json 文件三种方式对比 VScode clangd 插件浏览 linux 源码 …