您的位置:首页 > 编程语言 > Java开发

【Java】使用javaassist修改jar包

2016-04-30 10:15 501 查看
由于工作需要,可能会涉及到一些需要对第三方的一些jar包与源码进行修改的情况,这个时候javaassist就可以派上用场。

javaassist是一个开源的编辑、修改、创建字节码的类库,它在JBoos项目的AOP框架中发挥了很大的作用。不过我们这次仅仅使用它的修改class的功能。

1 准备工具

1.1 需要用到的工具

1.javaassist.jar 修改class字节码,修改类的结构,也可以将修改结果导出新的class文件,使用的时候需要作为lib导入到工程中  下载地址:javaassist

2.jd-gui 查看class和jar文件里的java代码  windows版下载  mac版下载  jd-gui下载官网

1.2 测试用的jar包

TestJar.jar

内部结构:



1.3 环境

jdk1.6 1.7 1.8 均可

任何编辑器均可,本人使用的是IntelliJ

1.4 工程源码

为了方便使用,首先给出当前工程的源码: TestJavaAssist

2 修改源码

2.1 使用JavaAssist

javaassist的使用需要先将javaassist.jar导入到工程中,之后就可以直接在工程里使用里面的方法了。下面给出用javaassist修改外部jar包中TestJar类的方法,并用反射测试了一下输出结果,最后将修改好的类输出到外部文件夹

// 修改方法
public static void changeMethode() {
try {
///////////////////////////////////
//  使用javaassist修改 class/jar 代码
///////////////////////////////////
//  设置jar包路径
ClassPool.getDefault().insertClassPath("../JarDemo/out/production/JarDemo/TestJar.jar");

// 获取需要修改的类
CtClass testJarClass = ClassPool.getDefault().getCtClass("TestJar");
// 获取类中的printTest方法
CtMethod printTestMethod = testJarClass.getDeclaredMethod("printTest");
// 修改该方法的内容
printTestMethod.setBody("System.out.println(\"hello obo\");");

///////////////////////////////////
//  使用反射测试输出,查看修改结果
///////////////////////////////////
Class newTestJarClass = testJarClass.toClass();
// 使用修改过的类创建对象
Object newTestJar = newTestJarClass.newInstance();
Method newPrintTestMethod = newTestJarClass.getDeclaredMethod("printTest");
newPrintTestMethod.invoke(newTestJar);

// 解除代码锁定,恢复可编辑状态
testJarClass.defrost();
// 写出到外存中
testJarClass.writeFile();
// testJarClass.writeFile(other path);

} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果没有问题的话,将会在外部文件生成一个新的TestJar.class 文件,用jd-gui 查看该class可以看到里面的printTest方法已经被修改了





2.2 重新打包

使用jdk自带的打包工具jar可以将class文件重新打包成jar文件

其给出了一些使用例子如下:

示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中: 
       jar cvf classes.jar Foo.class Bar.class 
示例 2: 使用现有的清单文件 'mymanifest' 并
           将 foo/ 目录中的所有文件归档到 'classes.jar' 中: 
       jar cvfm classes.jar mymanifest -C foo/ .

所以,我们在使用的时候需要使用terminal进入到class所在到文件目录,使用命令:

jar cvf NewTestJar.jar TestJar.class
在当前目录下打包生成NewTestJar.jar文件。

该文件就是修改后的jar包,使用jd-gui打开查看可以看到源码已经被修改。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息