WEB开发网
开发学院软件开发Java Classworking 工具箱: 注释(Annotation)与 ASM 阅读

Classworking 工具箱: 注释(Annotation)与 ASM

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 使用注释时要记住的一个因素是,命名值必须始终是编译时常量,Classworking 工具箱: 注释(Annotation)与 ASM(5),而且不能为 null,该规则适用于默认值(如果指定的话)和由用户设置的值,将会为在 JVM 中创建的每个类调用该转换器实例,转换器将获得到二进制类表示的访问

使用注释时要记住的一个因素是,命名值必须始终是编译时常量,而且不能为 null。该规则适用于默认值(如果指定的话)和由用户设置的值。我猜测这个决定是基于与早期 Java 语言定义的一致性而做出的,但是我觉得奇怪的是,对 Java 语言做出如此重大修改的规范,却只局限于这一方面的一致性。

实现生成

既然已经打好了基础,就该研究实现 classworking 转换了:当载入带注释的类时向它们添加 toString() 方法。该实现涉及三个单独的代码段:截获 classloading、访问注释信息和实际转换。

用 instrumentation 来截获

J2SE 5.0 给 Java 平台添加了许多特性。就我个人而言,我并不认为所有这些添加的特性都是改进。但是,有两个不太引人注意的新特性确实对 classworking 很有用,就是 java.lang.instrument 包和 JVM 接口,它们使您可以指定将在执行程序时使用的类转换代理,当然还有其他功能。

要使用转换代理,需要在启动 JVM 时指定代理类。当使用 java 命令来运行 JVM 时,可以使用命令行参数,以 -javaagent:jarpath[=options] 的形式来指定代理,其中“jarpath”是到包含代理类的 JAR 文件的路径,而“options”是代理的参数串。代理 JAR 文件使用一个特殊的清单属性来指定实际的代理类,这必须定义一个方法: public static void premain(String options, Instrumentation inst)。 该代理 premain() 方法将先于应用程序的 main() 方法调用,而且能够使用传入的 java.lang.instrument.Instrumentation 类实例注册实际的转换器。

该转换器类必须实现 java.lang.instrument.ClassFileTransformer 接口,后者定义了一个 transform() 方法。当使用 Instrumentation 类实例注册一个转换器实例时,将会为在 JVM 中创建的每个类调用该转换器实例。转换器将获得到二进制类表示的访问,并且可以在类表示被 JVM 加载之前修改它。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Classworking 工具箱 注释

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接