修改Jar包源码(无需反编译工具)(文章看起来很长,其实方法超级简单!)
2016-11-01 19:26
337 查看
前言:本文结合实际项目案例,介绍修改jar包源码的方式。(其中运用了一些小技巧~)
正文:
场景:在项目中用了第三方的jar包,但是jar包某个类的成员变量是private的,想将其改为public属性,以便为其赋值(源码中没有其提供简单的set方法)
问题:如下图中,源码虽然可以阅读,但是根本无法进行修改。
基本思路:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
那么这一整个流程下来,理论上就可以修改源码了。
实际操作:
第一次尝试(结果失败):将待修改的文件代码拷贝出来,放入到txt文档中,然后修改txt后缀为java。接着打开cmd使用javac 命令对该java文件进行编译。然后就会发现代码中引用的包找不到的错误。第一次尝试到此结束。
第二次尝试(结果成功):
上面方法肯定是不行的,因为该文件中引用了外部文件,只编译一个java文件肯定是不行。但是也不可能将其引用的文件都拷贝出来,毕竟其他文件也引用了别的文件,否则就会将整个jar包中的文件都复制出来了。
那有没有别的方法能够获得到修改后的java代码编译后的class文件呢?其实是有的!这里有个小技巧,就可以超简单的做的!
在本工程中新建一个java,与待修改的源文件同名。并且将源码中的代码拷贝在该新的java文件中,在新的文件中修改你想修改的类容(因为新文件时自己创建的,所以可以为所欲为的进行修改),然后你会发现在新的java代码中只会用一行代码错误,就是包名路径错误。
这是当然的,因为在jar包中该文件所在包中的位置和我们新建的文件在包中所在的位置是不一样的。当然我们不能将新文件的包名路径改掉,否则就算将该文件编译成功,放在jar中也是没用的。
那么既然如此,我们为何不新建一个包,使其满足该文件所需的包名路径呢?
例如上图中,源码文件中导的包名路径是com.android.pc.ioc.app。我们就在项目中新建这些包,然后将该新的java文件放置其中即可。
我们可以看到这时候,新的java文件就没有导包上的错误了。
接下来的工作就简单了,利用编译器将整个工程编译。自然就可以获得到新java文件的class文件!
然后我们就可以回到刚才的主线上了:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
随后解压该jar包,替换目标class文件,再次压缩回为jar文件即可!大功告成!
(Tips,在最后一步,压缩为jar文件时要选中两项文件后右键压缩,否则导入到工程后会出现包名找不到的错误,也不能在图中文件夹外部文件夹进行压缩,至于压缩jar包的文件名就没什么要求,可以随意取)
总结:本文中的描述方法的关键就是在编译器下通过新建包名对目标文件进行编译。
正文:
场景:在项目中用了第三方的jar包,但是jar包某个类的成员变量是private的,想将其改为public属性,以便为其赋值(源码中没有其提供简单的set方法)
问题:如下图中,源码虽然可以阅读,但是根本无法进行修改。
基本思路:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
那么这一整个流程下来,理论上就可以修改源码了。
实际操作:
第一次尝试(结果失败):将待修改的文件代码拷贝出来,放入到txt文档中,然后修改txt后缀为java。接着打开cmd使用javac 命令对该java文件进行编译。然后就会发现代码中引用的包找不到的错误。第一次尝试到此结束。
第二次尝试(结果成功):
上面方法肯定是不行的,因为该文件中引用了外部文件,只编译一个java文件肯定是不行。但是也不可能将其引用的文件都拷贝出来,毕竟其他文件也引用了别的文件,否则就会将整个jar包中的文件都复制出来了。
那有没有别的方法能够获得到修改后的java代码编译后的class文件呢?其实是有的!这里有个小技巧,就可以超简单的做的!
在本工程中新建一个java,与待修改的源文件同名。并且将源码中的代码拷贝在该新的java文件中,在新的文件中修改你想修改的类容(因为新文件时自己创建的,所以可以为所欲为的进行修改),然后你会发现在新的java代码中只会用一行代码错误,就是包名路径错误。
这是当然的,因为在jar包中该文件所在包中的位置和我们新建的文件在包中所在的位置是不一样的。当然我们不能将新文件的包名路径改掉,否则就算将该文件编译成功,放在jar中也是没用的。
那么既然如此,我们为何不新建一个包,使其满足该文件所需的包名路径呢?
例如上图中,源码文件中导的包名路径是com.android.pc.ioc.app。我们就在项目中新建这些包,然后将该新的java文件放置其中即可。
我们可以看到这时候,新的java文件就没有导包上的错误了。
接下来的工作就简单了,利用编译器将整个工程编译。自然就可以获得到新java文件的class文件!
然后我们就可以回到刚才的主线上了:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
随后解压该jar包,替换目标class文件,再次压缩回为jar文件即可!大功告成!
(Tips,在最后一步,压缩为jar文件时要选中两项文件后右键压缩,否则导入到工程后会出现包名找不到的错误,也不能在图中文件夹外部文件夹进行压缩,至于压缩jar包的文件名就没什么要求,可以随意取)
总结:本文中的描述方法的关键就是在编译器下通过新建包名对目标文件进行编译。
相关文章推荐
- 修改ie 源码查看工具的方法
- Windows8 正式版最简单的去除桌面水印方法 (无需修改系统文件,无副作用)
- 使用YOCTO编译环境修改内核源码的方法
- 最简单的方法来压缩图片(无需下载工具)
- 一个简单的SpringMVC项目到底需要哪些JAR包(文章最后附上最简单的方法导相关包)
- apk反编译方法(绝对简单实用)+ 反编译工具下载
- 编译android源码提示/usr/bin/jar命令不存在问题的解决方法
- 修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
- Android反编译工具介绍与简单实用方法
- idea导入spring源码提示jar包找不到错误修改方法
- VC++/MFC程序图标更改方法以及修改程序标题 超级简单啦
- Android反编译工具介绍与简单实用方法
- Eclipse安装反编译工具查看Jar包源码
- 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等
- DXperience 8.2.6注册方法(无需重新编译)、DXperience 8.2.6源码及官方下载
- CyanogenMod源码下载和编译以及简单修改
- windows8系统正式版最简单的去除桌面水印方法无需任何辅助工具
- Android反编译工具介绍与简单实用方法
- 修改jar包源码,成功编译,应用到项目中