`

利用javaassist修改Class文件

    博客分类:
  • j2se
 
阅读更多

我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的某些类或者某些方法不能满足我们的需求,但我们又没有源代码可以改,如果通过反编译的话又容易出错,javaassist这个第三方包就可以解决这个问题,这个第三方包支持对字节码的直接编辑,说得直白点,就是可以用这个第方包通过编程实现对Class类的直接修改。我也是刚用这个,所以写一点目前我知道的方法。
javaasist.jar这个包在网上可以方便下到,他里面主要有这么几个类
ClassPool:Class载入器
CtClass:可供修改的Class
CtMethod:可供修改的方法
CtField:可供修改的域
用法是通过ClassPool载入一个你要修改的类(载入成CtClass),那么你就可以用CtClass的方法去获取这个类的所有方法和域,并相应解析成CtMethod或者CtField,然后再修改。
举个例子,比如我有一个a.class,里面有一个方法叫public void b(int a){System.out.println(a);)
如果我想把这个方法改成public void b(int a){System.out.println(a+1);}
那么用如下代码

ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("a");
CtMethod m = cc.getDeclaredMethod("b");
上边的代码是将a.class载入到了cc,并将里面的b方法载入到了m,然后再进行修改,对方法的修改,CtMethod类提供了setBody(直接写入内容体),insertAfter(在后面补充),insertBefore(在前面补充)这些方法,下边是示例
m.setBody("{System.out.println(a+1);}");
这里要注意,写入的实际程序体需要用{}给包起来,如果没有会编译出错,但上边这样的写法编译还是会出错的,为什么呢,因为方法的参数不能够直接写在body里,而要用引用的方式,对CtMethod,提供了这样的引用方式,$1,$2....分别对应相应的参数,所以上边的代码要改成
m.setBody("{System.out.println($1+1);}");
这样就对了
这样我们就已经把这个方法改掉了,接下来要生成修改过后的Class文件,
cc.writeFile();
这样新的Class文件就生成了
那么实际的操作是怎么样的呢,我们应该先新建一个Java项目,然后把你要修改的Class所在的包以及javaassisst.jar都导入进去,然后写代码修改,最后生成的新class文件就会放置在你新建的这个项目下,然后你把这个修改过的class文件替换以前的就OK了。
分享到:
评论

相关推荐

    javassist-3.18.0-GA

    4. **使用javassist修改class文件.txt**: 这个文件可能是一个示例或教程,解释了如何利用 Javaassist 修改已存在的 `.class` 文件。通过读取这个文件,开发者可以学习到如何在运行时改变类的行为,例如添加新的...

    javassistDemo.zip

    这个"javassistDemo.zip"压缩包提供了一个示例,展示了如何利用Javaassist库动态修改Java类的方法。在Java应用程序中,这种能力非常有用,特别是在进行AOP(面向切面编程)或者在无法重新编译源代码的情况下需要修改...

    javassist-rel_3_20_0_ga-22-gccddf79

    7. 动态代理:可以利用Javaassist快速创建动态代理类,实现特定接口。 8. 支持JDK的新特性:Javaassist随着时间的推移不断更新,以支持新的Java语言特性,如Lambda表达式、模块系统等。 总的来说,Javaassist是一...

    javassist-3.7.ga.jar

    Javaassist 是一个强大的 Java 字节码操作库,它允许开发者在运行时动态修改...在理解了它的基本概念和用法后,开发者可以有效地利用 Javaassist 解决各种复杂的编程问题,尤其是那些需要在运行时改变代码行为的场景。

    javassist 包

    开发者可以利用Javaassist在方法调用前后插入拦截逻辑,实现如日志记录、性能监控等功能。 6. 转换源码:虽然Javaassist主要处理字节码,但也有能力将字节码转换回源码,这对于调试和理解代码非常有帮助。 7. 兼容...

    byte code 操作

    Java字节码是Java源代码(.java文件)经过Java编译器(javac)编译后生成的文件(.class文件)。这个字节码文件并不是直接在硬件上执行的,而是在Java虚拟机(JVM)中运行。JVM负责将字节码解释或即时编译成可在本地系统上...

    android运行时生成dex文件

    这对于Android的动态DEX生成特别有用,因为我们可以使用JavaAssist创建新的类,然后将这些类转换为.dex格式,最后利用DexClassLoader加载到运行的应用中。 JavaAssist提供了一系列API,如` CtClass `,` CtMethod `...

    JavaAgent例子-agentmain方式 demo

    4. **字节码修改**:在`agentmain`方法中,可以使用第三方库如Javaassist来修改目标类的字节码。Javaassist是一个开源的Java类库,能够方便地在运行时动态生成和修改类。通过ClassPool、 CtClass、CtMethod等对象,...

    javassist-3.9.0.GA.jar.zip

    1. **类转换(Class Transformation)**:Javaassist通过` CtClass `对象来表示Java类,我们可以加载一个已经存在的类,然后对它的字段、方法、构造函数进行添加、删除或修改。例如,我们可以动态添加一个新的方法到...

    javassist-3.18.2-GA.jar

    Javaassist 是一个强大的 Java 字节码操作库,它允许开发者在运行时动态修改或创建类。这个库在软件开发中的主要用途是实现元编程,即在程序运行时修改程序的行为。`javassist-3.18.2-GA.jar` 是 Javaassist 的一个...

    javassist-example

    Javaassist 提供了一种简单的方法来处理 Java 类的字节码,它的工作原理是通过解析已有的 `.class` 文件或者在内存中构建新的类结构。这个库广泛用于动态代理、AOP(面向切面编程)、性能监控以及代码插桩等领域。 ...

    javassist-3.11

    Javaassist是一个强大的开源类库,它为Java程序员提供了一种简单的方式来分析、修改以及生成Java字节码。这个工具在动态类型系统或者元编程场景下非常有用,比如在AOP(面向切面编程)、ORM(对象关系映射)框架、...

    java反编译泄露源码-bytecode-viewer:https://github.com/bygreencn/bytecode-viewe

    Java反编译是将已编译的字节码(.class文件)转换回源代码的过程,这在软件逆向工程、代码分析以及调试时非常有用。Bytecode Viewer是一款开源工具,用于查看和分析Java字节码,其GitHub仓库位于。这款工具可以帮助...

    eclipse帮助

    ### Eclipse——整合开发工具(基础篇) #### 一、Eclipse简介 **1.1 历史背景** Eclipse最初由IBM开发,并于...以上是对Eclipse的基础使用介绍,通过这些内容的学习,用户可以更好地利用Eclipse进行高效的软件开发。

    AssistTest:作为 Android 应用程序的 ASSIST 测试

    这通常涉及修改`build.gradle`文件,导入必要的库。 2. **创建测试类**:使用JUnit的`@RunWith(AssistTestRunner.class)`注解标记测试类,表明这个类中的测试方法将由AssistTest执行。 3. **编写测试用例**:在测试...

    Eclipse中文教材

    - 编辑器用于打开和编辑项目中的文件,如Java编辑器、文本编辑器等。 - **2.6.3 视景(PERSPECTIVE)** - 视景是预先定义好的一组视图和编辑器的布局,可以根据不同的任务需要切换不同的视景。 - **2.7 重新排列...

    eclipse 使用指南(一本中文使用说明,一本快捷键的汇总)

    5. **代码提示优化**:通过"Window" > "Preferences" > "Java" > "Editor" > "Content Assist"设置代码提示规则。 6. **使用版本控制系统**:Eclipse支持Git、SVN等多种版本控制,便于团队协作。 ### 四、Eclipse ...

Global site tag (gtag.js) - Google Analytics