我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的某些类或者某些方法不能满足我们的需求,但我们又没有源代码可以改,如果通过反编译的话又容易出错,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了。
分享到:
相关推荐
java利用jclasslib工具直接修改class文件
功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,开发者即时对字节码不是很熟悉,也可以非常方便快速的...
java修改class文件整个项目文件,需要结合jclasslib bytecode viewer来查看你修改的内容
资源分现在默认至少1分,网上也可以找到,修改class很方便
javaassist,class文件修改工具
轻松方便的把class文件转化为java文件
java反编译项目工程,可以将class 文件 进行 修改 重新导包 生成修改后的jar 步骤 1、将需要修改的 jar 包 放入 lib 目录下,并加入项目中 ,选中 jar 右击 选择 add a libray这个时候会看到 jar 的 目录 结构 2、...
能对电脑中的java类class文件进行查看与修改的工具
1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...
Java下的Class代码查看器+修改器
java反编译工具(.class文件反编译成.java文件) 解压后点击exe文件打开工具,点击open菜单选择.class文件执行后即生成.java文件 一直在使用的,方便,系统维护必不可少
java热加载Class文件.zipjava热加载Class文件.zipjava热加载Class文件.zip
java修改class文件使用的jclasslib.jar、javassist.jar等等文件。相关步骤、还有一个idea项目示例。(当时找了好久的jclasslib.jar文件,最后才找到一个可用的)
将.class文件反编译为.java文件,可以实现将别人的文件反编译后查看里面的代码。
修改jar包中的class文件文中用到的源码
Java 代码解析 class 文件
java class文件反编译器,可以看轻松查看源代码!下吧
java热加载Class文件
java语言实现的class文件解析,让你明白class文件中到底都有些什么东西。
Java中的class文件反编译程序. 可以把jar包中的class文件拖到该工具中,jd-gui就会自动编译整个jar包的其他class文件。