出于某些原因

需要把别人jar包里面的class修改一下信息

配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK..

在网上游荡了半天,没有找到合适的方法

开始我是先用jd-gui反编译 把我需要修改的那个A.class文件反编译出来把代码保存到A.Java

然后直接在dos里面用javac A.java编译

问题来了..

因为A.java引用了很多其他jar下面的方法 而且A.java有package

鼓捣了半天以后 最终结果:编译无法正常通过 不能达到直接修改替换掉别人的class文件的目的

于是又在网上转悠

看到jclasslib这个东西 于是又鼓捣了一会儿

居然成功了 窃喜 遂记下步骤方法 提供给需要的朋友..

软件安装: 把jclasslib 下载下来安装好 (我下的是3.0的,百度google很多..)

我这里以我自己写的一个小工具 POJOTool.jar 为例

软件打开画面效果如下

比如我想要修改 不能链接数据库的提示信息 为 "芝麻不开门!"

步骤如下:

1.用jd-gui打开该jar  怎么打开不用我说了吧?

打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity

找到对应需要修改的代码所在的方法名

我这里包含提示信息的这段代码在方法 getAllDataBase()  如下图:

2.用jd-gui或者winrar把GenEntity.class 解压出来到C盘 (目录无所谓)

3.双击桌面上安装好了的 jclasslib bytecode viewer ,点击软件的 File -- Open Class File 打开你刚解压出来的class文件

4.点击methods--getAllDataBase--Code

methods是表示方法不用说吧

getAllDataBase是刚在jd-gui里面找到的方法名

Code包含了getAllDataBase方法里所有的信息

找到"不能打开数据库连接,请检查!"

这里这个工具没有提供搜索功能

如果这里很多内容 那么你可以点击 copy to clipboard把这里的内容复制到一个文本文件里面然后再搜索

这里找到的是第82行

5.点击第 82行后面的 #34 会跳转到Constant Pool常量池的第34个常量

6.再点右边的 cp info #362 会跳转到第362个常量

这里能看到String: 不能打开数据库连接,请检查! 也就是最后输出的信息

7.找到GenEntity.class的关键常量了现在就该修改它了

在eclipse里面新建一个Test来处理GenEntity.class

  1. import java.io.*;
  2. import org.gjt.jclasslib.io.ClassFileWriter;
  3. import org.gjt.jclasslib.structures.CPInfo;
  4. import org.gjt.jclasslib.structures.ClassFile;
  5. import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. String filePath = "C:\\GenEntity.class";
  9. FileInputStream fis = new FileInputStream(filePath);
  10. DataInput di = new DataInputStream(fis);
  11. ClassFile cf = new ClassFile();
  12. cf.read(di);
  13. CPInfo[] infos = cf.getConstantPool();
  14. int count = infos.length;
  15. for (int i = 0; i < count; i++) {
  16. if (infos[i] != null) {
  17. System.out.print(i);
  18. System.out.print(" = ");
  19. System.out.print(infos[i].getVerbose());
  20. System.out.print(" = ");
  21. System.out.println(infos[i].getTagVerbose());
  22. if(i == 362){
  23. ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
  24. uInfo.setBytes("芝麻不开门!".getBytes());
  25. infos[i]=uInfo;
  26. }
  27. }
  28. }
  29. cf.setConstantPool(infos);
  30. fis.close();
  31. File f = new File(filePath);
  32. ClassFileWriter.writeToFile(f, cf);
  33. }
  34. }

这里需要注意"C:\\GenEntity.class"是我存放class的目录

if(i == 362) 这里是刚我在第七步找到的常量序号

"芝麻不开门!"这里是我想修改的文字信息!

运行Test.java 会有如下提示信息 没有报错就证明正常的 如果报错那么就有问题

9.把C盘刚修改后的GenEntity.class替换掉原来的GenEntity.class

怎么替换不用我说了吧..

用winrar打开.jar 然后把GenEntity.class拖进去覆盖就行了

10.运行效果..

大功告成...

直接修改别人jar包里面的class文件 工具:jclasslib的更多相关文章

  1. 你知道怎么从jar包里获取一个文件的内容吗

    目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...

  2. 记一次如何解决低版本jar包里面的bug,不适宜替换成高版本的经历

    背景:目前正在迭代开发的项目,应用户要求新增一个电子文档转换的功能,即将不标准的excel文件转换为标准的excel文件(标准模板). 选择:pio ,本项目里面本来就有poi的jar包 问题:项目里 ...

  3. spring boot 扫描 其他jar包里面的 mapper xml

    启动类配置扫描 goods.mapper为当前项目mapper路径 ,common.mpper为其他jar包. 1. 2.mybatis.mapper-locations=classpath*:map ...

  4. spring3 mvc使用注解方式时,不能扫描jar包里面的类

    使用eclipse export工具时选中Add directory entries可以解决.

  5. java之扫描包里面的class文件

    一.class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法.但是扫描class就是一个很大的问题了. 二.所以我这里写了一个简单的class文件扫描方式. 三.主要是利 ...

  6. Java读取其他jar包里的配置文件

    最近要做个东西,需要自己控制数据库的事物,项目封装的框架,实在是提不起去阅读的兴趣, 就想直接去读框架的底层实现里面的数据连接的配置文件(如:Url,port,username,password等), ...

  7. ant 打 jar 包添加 manifest.mf 文件

    经查询 ant 有 <manifest> 任务可以创建 manifest文件(https://ant.apache.org/manual/Tasks/manifest.html) 但尝试在 ...

  8. Java 操作jar包工具类以及如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  9. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

随机推荐

  1. SQL-Customers Who Never Order

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  2. 上海游侠电动汽车团队招募。iOS,Android,产品经理以及 SEVER 端工程师 - V2EX

    上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师 - V2EX 上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师

  3. 关闭myeclipse中jsp的校验功能

    window--->preference--->Myeclipse--->Validation,取消下图红框中的选中状态.

  4. javascript中子类如何继承父类

    参考阮一峰的文章:http://javascript.ruanyifeng.com/oop/inheritance.html#toc4 function Shape() { this.x = 0; t ...

  5. android 限制adb的访问目录

    最近有个特殊的要求,engneer版本既要可以adb访问,且adb有的目录不能访问 如/data/目录. 用传统的chmod chgrp等无法满足客户需求,只能修改内核文件系统部分. 添加函数,检查路 ...

  6. (3)选择元素——(15)总结(Summary)

    With the techniques that we have covered in this chapter, we should now be able to locate sets of el ...

  7. 查看android进程信息

    打开adb shell.直接ps命令 假设查看某特定进程,比方<圣火英雄传>.用grep过滤 各列參数意义: USER        进程当前用户: PID             Pro ...

  8. Codeforces Round #FF (Div. 2):Problem A - DZY Loves Hash

    A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. linux nc命令

    即NetCat简写,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小).功能实用,被设计为一个简单.可靠的网络工具 ...

  10. web_api vs2015 新加标题无法打开

    HomeController 去掉特性[Authorize]