繁体中文
设为首页
加入收藏

推荐

公告

推荐文章
· 新手入门:写Java程序的三...
· Java SE 6新特性:Instru...
· Java SE 6 新特性: HTTP...
· Hibernate的检索策略小结
· AJAX推送与拉取方式的比较
· Java有能力抵挡LAMP的进...
· Hibernate+Struts的J2EE...
· 想动就“动”-Java也可以...
· Spring 2.0+ JRuby 快速入门
· 对J2EE中的DAO组件编写单...
热点文章
广告

当前位置:设计首页 >> 程序开发 >> Java >> Java SE 6新特性:Instrumentation

Java SE 6新特性:Instrumentation (4)

2008-01-02 09:54:51  作者:  来源:互联网  浏览次数:18  文字大小:【】【】【
简介:  简介   利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instr ...
关键字:特性
  Java SE 6 新特性:BootClassPath / SystemClassPath 的动态增补

  我们知道,通过设置系统参数或者通过虚拟机启动参数,我们可以设置一个虚拟机运行时的 boot class 加载路径(-Xbootclasspath)和 system class(-cp)加载路径。当然,我们在运行之后无法替换它。然而,我们也许有时候要需要把某些 jar 加载到 bootclasspath 之中,而我们无法应用上述两个方法;或者我们需要在虚拟机启动之后来加载某些 jar 进入 bootclasspath。在 Java SE 6 之中,我们可以做到这一点了。

  实现这几点很简单,首先,我们依然需要确认虚拟机已经支持这个功能,然后在 premain/agantmain 之中加上需要的 classpath。我们可以在我们的 Transformer 里使用 appendToBootstrapC???椠?? lassLoaderSearch/appendToSystemClassLoaderSearch 来完成这个任务。

  同时我们可以注意到,在 agent 的 manifest 里加入 Boot-Class-Path 其实一样可以在动态地载入 agent 的同时加入自己的 boot class 路径,当然,在 Java code 中它可以更加动态方便和智能地完成 —— 我们可以很方便地加入判断和选择成分。

  在这里我们也需要注意几点。首先,我们加入到 classpath 的 jar 文件中不应当带有任何和系统的 instrumentation 有关的系统同名类,不然,一切都陷入不可预料之中 —— 这不是一个工程师想要得到的结果,不是吗?

  其次,我们要注意到虚拟机的 ClassLoader 的工作方式,它会记载解析结果。比如,我们曾经要求读入某个类 someclass,但是失败了,ClassLoader 会记得这一点。即使我们在后面动态地加入了某一个 jar,含有这个类,ClassLoader 依然会认为我们无法解析这个类,与上次出错的相同的错误会被报告。

  再次我们知道在 Java 语言中有一个系统参数“java.class.path”,这个 property 里面记录了我们当前的 classpath,但是,我们使用这两个函数,虽然真正地改变了实际的 classpath,却不会对这个 property 本身产生任何影响。

  在公开的 JavaDoc 中我们可以发现一个很有意思的事情,Sun 的设计师们告诉我们,这个功能事实上依赖于 ClassLoader 的 appendtoClassPathForInstrumentation 方法 —— 这是一个非公开的函数,因此我们不建议直接(使用反射等方式)使用它,事实上,instrument 包里的这两个函数已经可以很好的解决我们的问题了。

  结语

  从以上的介绍我们可以得出结论,在 Java SE 6 里面,instrumentation 包新增的功能 —— 虚拟机启动后的动态 instrument、本地代码(native code)instrumentation,以及动态添加 classpath 等等,使得 Java 具有了更强的动态控制、解释能力,从而让 Java 语言变得更加灵活多变。

  这些能力,从某种意义上开始改变 Java 语言本身。在过去很长的一段时间内,动态 脚本语言的大量涌现和快速发展,对整个软件业和网络业提高生产率起到了非常重要的作用。在这种背景之下,Java 也正在慢慢地作出改变。而 Instrument 的新功能和 Script 平台(本系列的后面一篇中将介绍到这一点)的出现,则大大强化了语言的动态化和与动态语言融合,它是Java 的发展的值得考量的新趋势。
[1] [2] [3] [4]


相关文章
了解ActionScript3.0的新特性
体验Adobe Flash CS3新特性
Java SE 6 新特性: HTTP 增强
Java SE 6 新特性: JMX 与系统管理