当前位置: 首页 > news >正文

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);

相关文章:

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

Javassist讲解1(介绍,读写字节码) 介绍一、读写字节码1.如何创建新的类2.类冻结 介绍 javassist 使Java字节码操作变得简单,它是一个用于在Java中编辑字节码的类库; 它使Java程序能够在运行时定义一个新类,…...

【Linux】常见指令以及具体其使用场景

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,随着博主的学习,博主掌握的技能也越来越多,今天又根据最近的学习开设一个新的专栏——Linux,相信Linux操作系…...

后台管理(二)

1、权限控制 如果没有权限控制,系统的功能完全不设防,全部暴露在所有用户面前。用户登录以后可以使用系统中的所有功能。这是实际运行中不能接受的,所以权限控制系统的目标就是管理用户行为,保护系统功能。 1.1、 定义资源 资源就…...

反转链表II(C++解法)

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1…...

记一次 logback 没有生成独立日志文件问题

背景 在新项目发布后发现日志文件并没有按照期望的方式独立开来&#xff0c;而是都写在了 application.log 文件中。 问题展示 日志文件&#xff1a; 项目引入展示&#xff1a; <include resource"paas/sendinfo/switch/client/sendinfo-paas-switch-client-log.…...

数据库强化(1.视图)

1.什么是视图 视图是指计算机数据库中的视图&#xff0c;是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。但是&#xff0c;视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的…...

Mysql与SeaweedFS数据不同步问题产生原因及解决办法

文章目录 Mysql与SeaweedFS数据不同步问题的探究与解决问题背景原因探究不一致的写操作缺乏事务管理 解决方案引入分布式事务处理使用消息队列 实践演示&#xff08;python代码&#xff09;结论 Mysql与SeaweedFS数据不同步问题的探究与解决 问题背景 在数据库和文件存储系统…...

Kotlin apply和with用法和区别

apply apply 是 Kotlin 标准库中的一个函数&#xff0c;它允许你在对象上执行一系列操作&#xff0c;然后返回该对象自身。它的语法结构如下&#xff1a; fun <T> T.apply(block: T.() -> Unit): T这个函数接受一个 lambda 表达式作为参数&#xff0c;该 lambda 表达…...

springboot通过aop自定义注解@Log实现日志打印

springboot通过aop自定义注解Log实现日志打印 文章目录 效果图实操步骤1.引入依赖2.自定义日志注解3.编写日志切面类4.UserController5.运行 效果图 实操步骤 注意&#xff0c;本代码在springboot环境下运行&#xff0c;jdk1.8 1.引入依赖 <dependency><groupId>…...

k8spod详解其二

一&#xff0c;资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为…...

golang包的管理

Go语言中包的使用 Go语言使用包&#xff08;package&#xff09;这种语法元素来组织源码&#xff0c;所有语法可见性均定义在package这个级别&#xff0c;与Java 、python等语言相比&#xff0c;这算不上什么创新&#xff0c;但与C传统的include相比&#xff0c;则是显得“先进…...

Windows10安装Anaconda与Pytorch的记录

这是一篇关于安装Anaconda和Pytorch的记录与复盘&#xff0c;写的原因是我电脑恢复系统之后东西全没了&#xff0c;再装Pytorch的时候一脸懵逼忘了怎么弄了&#xff0c;写篇记录以备我下一次安装。 1、Anaconda的安装 1.1、Anaconda安装包下载 下载链接: Free Download | An…...

图解Kafka高性能之谜(五)

高性能的多分区、冗余副本集群架构 高性能网络模型NIO 简单架构设计&#xff1a; 详细架构设计&#xff1a; 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引&#xff1a; 高响应的磁盘拷贝技术 kafka采用sendFile()的…...

opencv在linux上调用usb摄像头进行拍照

功能 1.按照指定的文件名创建文件夹&#xff0c;创建之前判断该文件夹是否存在 2.调用摄像头按可调整窗口大小的方式显示 3.按esc退出摄像头画面 4.按p保存当前摄像头的画面&#xff0c;并按当前时间为照片的名字进行保存打开终端查看是否有摄像头 ls /dev/video*一般video1就…...

软考之知识产品+例题

知识产权 保护期限 公民作品 没有限制 署名权、修改权、保护作品完整权 作者终生及其死亡后的第 50 年的 12月31日 发表权、使用权、获得报酬权 单位作品 首次发表后的第 50 年的 12月31 日&#xff0c;若未发表则不受保护 发表权、使用权、获得报酬权 公民软件作品 没…...

玩了一下 Jenkins,最新版本 + JDK11

背景 今年五月的时候玩了一下 Jenkins&#xff0c;最新版本 2.414.3 &#xff0c;JDK 11 。本机有两个 JDK&#xff0c;只放到 Tomcat 里面了&#xff0c;看到了一个启动页面&#xff0c;后面有其他事情就忘记了。最近又想起来&#xff0c;觉得还是应该玩一下这么有技术含量的…...

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN&#xff0c;对图片进行分类并使用图片进行测试模型-适合入门&#xff0c;从模型到训练再到测试&#xff1a;开源项目 开源项目完整代码及基础教程&#xff1a; https://mbd.pub/o/bread/ZZWclp5x CNN模型&#xff1a; 1.导入必要的库和模块&…...

C# 使用.NET的SocketAsyncEventArgs实现高效能多并发TCPSocket通信

简介&#xff1a; SocketAsyncEventArgs是一个套接字操作得类&#xff0c;主要作用是实现socket消息的异步接收和发送&#xff0c;跟Socket的BeginSend和BeginReceive方法异步处理没有多大区别&#xff0c;它的优势在于完成端口的实现来处理大数据的并发情况。 BufferManager类…...

设计模式——观察者模式(Observer Pattern)+ Spring相关源码

文章目录 一、观察者模式定义二、例子2.1 菜鸟教程例子2.1.1 定义观察者2.1.2 定义被观察对象2.1.3 使用 2.2 JDK源码 —— Observable2.2.1 观察者接口Observer2.2.1 被观察者对象Observable 2.3 Spring源码 —— AbstractApplicationContext2.3.1 观察者2.3.2 被观察者 2.3 G…...

openpnp - code review - 开机对话框历史记录和贡献者名单

文章目录 openpnp - code review - 开机对话框历史记录和贡献者名单概述笔记D:\my_openpnp\openpnp_dev_2022_0801\src\main\java\org\openpnp\gui\AboutDialog.javaEND openpnp - code review - 开机对话框历史记录和贡献者名单 概述 偶然发现, 自己打包后的openpnp, 开机后…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...