前段时间为了公司里的线上工程监控用到了这个小jar包,看起来挺有用,学习下,做个笔记。
Javassist 基础
Javassist 使您可以检查、编辑以及创建 Java 二进制类。检查方面基本上与通过 Reflection API 直接在 Java 中进行的一样,但是当想要修改类而不只是执行它们时,则另一种访问这些信息的方法就很有用了。这是因为 JVM 设计上并没有提供在类装载到 JVM 中后访问原始类数据的任何方法,这项工作需要在 JVM 之外完成。
Javassist 使用 javassist.ClassPool 类跟踪和控制所操作的类。这个类的工作方式与 JVM 类装载器非常相似,但是有一个重要的区别是它不是将装载的、要执行的类作为应用程序的一部分链接,类池使所装载的类可以通过 Javassist API 作为数据使用。可以使用默认的类池,它是从 JVM 搜索路径中装载的,也可以定义一个搜索您自己的路径列表的类池。甚至可以直接从字节数组或者流中装载二进制类,以及从头开始创建新类。
装载到类池中的类由 javassist.CtClass 实例表示。与标准的 Java java.lang.Class 类一样, CtClass 提供了检查类数据(如字段和方法)的方法。不过,这只是 CtClass 的部分内容,它还定义了在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。奇怪的是,Javassist 没有提供删除一个类中字段、方法或者构造函数的任何方法。
字段、方法和构造函数分别由 javassist.CtField、 javassist.CtMethod 和 javassist.CtConstructor 的实例表示。这些类定义了修改由它们所表示的对象的所有方法的方法,包括方法或者构造函数中的实际字节码内容。
所有字节码的源代码
Javassist 让您可以完全替换一个方法或者构造函数的字节码正文,或者在现有正文的开始或者结束位置选择性地添加字节码(以及在构造函数中添加其他一些变量)。不管是哪种情况,新的字节码都作为类 Java 的源代码声明或者 String 中的块传递。Javassist 方法将您提供的源代码高效地编译为 Java 字节码,然后将它们插入到目标方法或者构造函数的正文中。
Javassist 接受的源代码与 Java 语言的并不完全一致,不过主要的区别只是增加了一些特殊的标识符,用于表示方法或者构造函数参数、方法返回值和其他在插入的代码中可能用到的内容。这些特殊标识符以符号 $ 开头,所以它们不会干扰代码中的其他内容。
对于在传递给 Javassist 的源代码中可以做的事情有一些限制。第一项限制是使用的格式,它必须是单条语句或者块。在大多数情况下这算不上是限制,因为可以将所需要的任何语句序列放 到块中。下面是一个使用特殊 Javassist 标识符表示方法中前两个参数的例子,这个例子用来展示其使用方法:
{
System.out.println("Argument 1: " + $1);
System.out.println("Argument 2: " + $2);
}
对于源代码的一项更实质性的限制是不能引用在所添加的声明或者块外声明的局部变量。这意味着如果在方法开始和结尾处都添加了代码,那么一般不能将在 开始处添加的代码中的信息传递给在结尾处添加的代码。有可能绕过这项限制,但是绕过是很复杂的 — 通常需要设法将分别插入的代码合并为一个块。
分享到:
相关推荐
Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...
`javassist`是一个强大的字节码编辑器和类文件操作库,它能够帮助开发者动态地创建或修改类定义。通过`javassist`,可以方便地添加方法、字段或修改现有方法的行为,而无需接触原始源代码。 ##### 2. jclasslib `...
总的来说,Javassist是一个强大的工具,可以帮助Java开发者在运行时操纵字节码,实现动态代码生成和类的动态修改。通过理解和掌握Javassist,开发者可以在各种复杂场景下提升代码的灵活性和可扩展性,特别是在那些...
javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码
例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,以实现如性能优化、日志记录、事务管理等功能。 四、字节码操作的应用场景 1. **性能优化**:通过修改字节码,可以...
Java字节码编辑是Java开发中的一个高级主题,它允许开发者在运行时修改或增强类的行为。`javassist`库正是这样一个工具,它为Java...学习并熟练掌握`javassist`,将极大地提升你在Java动态编程和字节码操作方面的技能。
下面是一个简单的例子,展示如何找到一个带有特定注解的方法并修改其字节码: 1. **获取注解信息**:首先,我们需要定义一个自定义注解,比如`@MyAnnotation`。然后,我们可以使用反射API找到包含该注解的类和方法...
Javassist是一个强大的Java字节码操作库,它允许开发者在运行时动态修改或创建类。Javassist的出现使得开发者无需深入理解底层字节码指令就能方便地操作类、方法和字段,降低了字节码操作的难度。下面将详细介绍...
Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。下面是一个详细的知识点总结: 一、Javassist 概述 Javassist是一个 Java 字节码操作类库,用于生成、修改和加载 Java 字节码。...
在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...
它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时定义新类,并在JVM加载它时修改类文件。 与其他类似的字节码编辑器不同,Javassist提供了两个级别的API:源级别和字节代码级别。 如果用户使用源代码级...
1. **插件系统**:通过修改字节码实现在运行时动态扩展功能。 2. **安全审计**:分析字节码以检测潜在的安全风险。 3. **性能监控**:在字节码层面插入监控代码,以获取更精确的性能数据。 4. **代码混淆**:通过...
总之,jbosss-javassist结合了Javassist和JByteMode的优势,为开发者提供了一套完整的动态字节码操作解决方案。通过熟练掌握这两个工具,开发者可以应对各种复杂的代码修改和增强需求,提升软件的灵活性和可维护性。...
1. **字节码生成**:Javassist可以动态生成类的字节码,并将其加载到当前的Java虚拟机中。这对于创建动态代理类或在运行时添加新的方法和字段非常方便。 2. **类转换**:它允许开发者在运行时修改类的方法体,例如...
字节码编程是Java技术领域中的一个重要组成部分,它涉及到Java类文件的二进制表示形式,即Java字节码。Java虚拟机(JVM)在运行Java程序时,实际上是在解释和执行这种字节码。字节码编程允许开发者在类加载到JVM之前...
总结来说,Javaagent 和字节码修改提供了一种强大但潜在危险的工具,可以用来动态改变 Java 类的行为,包括原生类的方法。在安全性和合规性的前提下,这项技术可以用于调试、测试和增强软件,但在不恰当的使用下,也...
1. 创建自定义Gradle插件:首先,我们需要创建一个Gradle插件项目,定义插件类,并在`apply`方法中实现字节码操作逻辑。 2. 字节码分析与修改:使用如ASM库,我们可以读取应用的字节码,遍历每个类及其方法。对于...
javassist是一个开源的Java字节码操作库,它可以动态修改类的字节码,实现运行时代码增强。开发者无需理解复杂的字节码格式,只需使用javassist提供的API,就可以轻松地添加、删除或修改类的方法、字段甚至整个类。...
4. **类转换**:`javassist` 提供了转换器,可以将类从一种形式转换为另一种形式,例如从 Java 源码转换为字节码。 另一方面,`jd-gui` 是一个独立的图形化工具,用于反编译 Java 字节码为源代码。在开发过程中,...