`

javassist[动态改字节码]学习一

    博客分类:
  • j2se
 
阅读更多


前段时间为了公司里的线上工程监控用到了这个小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 修改class字节码

    Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...

    javassist, Java字节码工程工具包.zip

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

    借助jclasslib与javassist修改java class字节码

    借助jclasslib与javassist修改java class字节码.doc

    javassist,Java字节码工程工具包.zip

    Java字节码工程工具包

    javassist试图简化Java字节码的编辑

    javassist:试图简化Java字节码的编辑

    Javassist如何操作Java 字节码

    主要介绍了Javassist如何操作Java 字节码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

    javassist:Java字节码工程工具包

    它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时定义新类,并在JVM加载它时修改类文件。 与其他类似的字节码编辑器不同,Javassist提供了两个级别的API:源级别和字节代码级别。 如果用户使用源代码级...

    javassist-3.14.0-GA

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    Javassistjar包

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javassist官方手册(中文)

    javassist是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到jvm。文档内容全面。

    javassist反射工具

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    免费开源!!Java字节码工程工具包

    Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是Java中用于编辑字节码的类库;它使 Java 程序能够在运行时定义新类,并在 JVM 加载时修改类文件。与其他类似的字节码编辑器不同,Javassist 提供两个...

    javassist.zip

    Javassist(JAVA编程助手)进行JAVA字节码操作 易于理解的它是一个用于在Java中编辑字节码的类库;它支持Java 程序在运行时定义一个新类,并在 JVM加载它。与其他类似的字节码编辑器不同,Javassist提供了 API的...

    Javassist-3.12

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法...

    DroidAssist,一个基于javassist的轻量级android studio gradle插件,用于在android中编辑字节码。.zip

    机器人助手提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的...

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    JavaAgent Javassist 与 Asm JavaAgent 字节码动态编程项目

    javassist API chm格式

    javassist API chm格式 字节码生成类库

    javassist-3.18.0-ga.jar

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    javassist-3.12.1.GA.jar

    开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

Global site tag (gtag.js) - Google Analytics