在 Eclipse 中跟踪 JDK 局部变量

jdk 无疑在开发过程中占有巨大作用,无论是开发需要,还是源码学习需要,能够方便进行跟踪调试会给整个过程带来极大的愉悦感~~

这里我举个李子

MyMap.java

…public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put(“theKey”, “theValue”);}…

这里我们可以看到对于 HashMap 进行了 put 的调用,那么内部是怎么搞的尼,请下看

HashMap.java

…public V put(K key, V value) {if (table == EMPTY_TABLE) {inflateTable(threshold);}if (key == null)return putForNullKey(value);// local variablesint hash = hash(key);// local variablesint i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}…

源码中,有几处都是用局部变量的,可惜如果我们就这样贸然进去,人家会不舒服就不会将秘密告诉你了 -_-|||

下载过 jdk 包的帅哥靓妹应该都还是清楚的哈,曝个照先

这是一个完整的 jdk 包,可以看到是目前 7 系列最新的哟~~,直接给个地址吧,想知道包的含义就去看看,原版

看到那个 rt.jar 了吗?这个就是重中之重啦,人家的全称是 ~~ runtime.jar ~~ 这么理解吧,有么有觉得很吊。也就是说你小样儿用的各种 Map/Set/Array… 啥啥的都是在人家地盘上转。

所以呢,要想人家掏心窝,首先我们就要主动出击,出其不备,一举拿下。其实最直接的想法就是,这货不就是 Oracle 给打包出来的么,为啥就不能痛快点呢,让咱们也好好用用呀,还非得留一手啊~~如果这么想那就太没人情味了,怎么说人家也是战斗机中的巨无霸啊,,凡事会考虑个一二三的哇,且听咱道来。

翻译过来的~~

rt.jar 包含所有与 Java SE 核心 API 相对应的 RunTime 类

由于所有在 rt.jar 中的类对 JVM 来说都是 “亲戚”,当 JVM 在载入这些个类时它们会有特例不会进行各种 check。这个做法也有许多的性能方面的原因。这些 classes 是由 The Primordial Class Loader 载入的,这就是为什么在别的 jars/classes 需要被 JVM check 的时候 rt.jar 能够避免这些 basic security checks 了。果然是亲生的了~~

果然非同一般呀, 不过呢,为了咱广大的码农还是给出了 src.zip。在我们没有动过 rt.jar 的时候,里边类是由源代码通过去掉调试信息的方式编译的,这就是为啥咱们看不到局部变量的值了,详细内容各位自行查找吧。

很明显我们接下来就去实现我们本文的重点吧,貌似废话挺多的~~

咱是在 Ubuntu 上玩的哈,先再个给已经安装好的靓照

嗯。和下载的其实差不多吧~~

上边也提过,我们在开发过程中使用到的 JDK 都是来自于 rt.jar 的,那么我们只要将 src.zip 中的全部或者自己需要的进行编译,然后打包放好那岂不是就可以了么~~

有这么几个步骤

咱是以自己的环境为准哈,帅哥靓妹们可以套套步骤,整体方法,命令差别不大

搭建编译环境

上图 我们先到 JDK 安装路径下找到俩东西

src.zip

那个红红的就是啦,当然我们是可以直接从下载的压缩包里搞出来,但是还是建议在自己安装的 JDK 里边吧,也方便嘛,而且版本绝对不会出问题~~

rt.jar

最右边那红红哒~~

然后在咱的 home 创建了如下的目录结构,以及 copy 过来的俩东西

目录 jdk(这个随意)

在此文件夹下还有一个 out 和 src 目录,分别是编译后存放类的目录

目录 src(同上)

可以看到这里边有三个目录 java/javax/org,分别就对应到基础类的顶级包,当然也是可以把所有的都给解压出来哈

咦,有没有发现这里多了一个东西呢,files.txt,对,这就是所以需要进行编译的文件相对位置文件咯

来,局部图片

感觉是不是很吊的样子,咱一直对这种密密麻麻的东西感觉很兴奋呀,变态~~

这个文件的生成还是比较简单的,至少在 Ubuntu 或者是 Linux/Unix 系列下

find -name *.java > files.txt

好,这样文件就生成了~~

关键一步,在此献上

javac /home/ice/temp/jdk/src txt

大家看看应该还是比较容易理解哈

-sourcepath 咱需要编译的类所在目录

-d 生成的编译文件存放目录

-cp(classpath) 运行时指定的环境,可是为啥要用到 rt.jar 尼?不是要把他给费了么?嗯,这个其实只要看看 src.zip 就大概懂了,把里边的内容和 rt.jar 中的进行比较一下

在 src.zip 中是不是没有发现 sun 呢,对啦,就不给咱,那也没办法,而她却是重中之重啊,让我们默默的把她带上吧~~ 提一句,在 Ubuntu 下,最好要将 rt.jar 拷贝出来,这里边有权限问题,烦

-g 这哥么儿就是说,把调试信息给咱们塞进去哈,谢啦~~

@files.txt 这个就是刚刚我们生成的需编译类类表啦

-J 这个么,一些 jvm 运行参数配置咯~~

就这么一运行,哦靠,咱么编译成功啦

这几个就是咱么的好伙伴啦,不好意思,多添了俩包进去^_^

继续

jar cf0 rt_debug.jar *

这个呢就是把这些个给打包咯~~

紧接着要干啥呢,其实我们基本上及完成了 99% 啦,最后就是看把她放哪儿了

和 rt.jar 处于同一个目录下,与标准的比比,会发现多了一个目录

endorsed

对,就是她了

我们只要把咱么地宝贝 rt_debug.jar copy 过来就好啦 ^_^

恶,怎么验证呢,简单呀,调试上边的代码,跟踪进行去看看呗~~

看到没,看到没,局部变量出现啦~~

我要说,谢谢观看 ^_^

有错误/有建议/有不爽,还请各位帅哥靓妹 留言哈~~

~~~ 给大家个工具,不过现在用的帅哥靓妹挺多了吧, STS(Spring Tool Suit) 一个基于 Eclipse,而且集成了诸多对于开发 Spring 为基础的应用有帮助的插件啥的 ~~

爬上那座山,听最圣洁的经。

在 Eclipse 中跟踪 JDK 局部变量

相关文章:

你感兴趣的文章:

标签云: