`

Java开发的一些Hacker技巧

阅读更多

在Java开发的世界里,最开心的事情是很多库都是开源的,而且很多开源协议都允许你修改源代码并且重新发布。可是,有的时候,我们还是不得不面对一些无法找到源代码的情况,可是我们又需要看到源代码,甚至需要重新编译库。什么时候会碰到这种情况呢?我举一些例子。

 

      我们用某个库,发现某些情况异常出现在库里面,可是我们Google又找不到原因。可能这个时候我们想看看源代码,加入一些Logger的输出,看看到底怎么回事。可能这个库开源,可是我一时很难找到对应于这个Jar的源代码版本,或者查找要花很多时间。

 

       其实上面的例子就包括两种情况,1就是查看源文件,也许一看就明白为什么会丢出那个异常 2.修改源文件,重新编译打包运行。如果只是想看源文件,我强烈推荐工具:JDGUI,官方网站:http://java.decompiler.free.fr/。 最大的有点就是有图形界面,查看起来很方便,而且不同类之间可以链接。缺点是生成的代码我觉得没有Jad好,可是不影响阅读。其实查看如果可以解决问题,是很不错的,因为如果纯粹为了解决问题看看源代码,应该不算违法吧。2重新编译打包,这个需要一些技巧。首先,我推荐用jad这个工具反编译class文件,然后呢,找到编译这个java文件需要的库。一般情况下,本身这个jar是需要在classpath里面的,而且可能需要很多其他的库。不过一般也不会太多。然后编译好这个class文件,用jar -uf xxx.jar com.yyy.zzz.AAA.class这种命令就可以更新这个jar。这个工作理论不复杂,可是需要很强的解决问题的能力和Java的基础能力,当然阅读代码的能力也要很强大(牛和不牛,这个方面可以体现的淋漓精致),而且那种“成就感”可以让你像吃了兴奋剂一样^_^

 

      可是有的时候,我们没办法反编译源代码,或者反编译之后我们不能发布(我们还是要尊重法律的)。怎么办呢?其实有些时候可能我们不需要重新编译,可能使用一些反射的机制就可以解决问题了。譬如:

      [1]我们确实想访问某个非public的方法;

      [2]我们确实想修改一个private变量的值。

      我知道这么做不好,可是有时候真的需要。怎么办呢?使用Java的反射机制。先使用class的getMethod方法找到这个方法method,然后再使用method.setAccessible(true),再使用method.invoke(object, arg)来调用这个方法。这个思路我用过很多次,应该是

满不错的解决方案。有个地方要注意一下,如果你有个对象A a = new B(); 假设B extends A。如果你需要找的方法fun是

A的方法, B是继承来得。那么你需要明确用A.class.getMethod,而不能使用B.class.getMethod。

分享到:
评论
1 楼 pocketduck 2009-06-30  
lz法律意识这么强啊,这种东西防君子不防小人的,你后面的提到的方法可以是可以,不过也太麻烦了吧,直接把需要看的部分反编译了最简单直接了,就是你上面提到的

相关推荐

Global site tag (gtag.js) - Google Analytics