Java编程的动态特性, 从Reflection到Runtime Class Transformation

标签: java 编程 reflection | 发表时间:2013-11-23 11:00 | 作者:barryzhong
出处:http://www.iteye.com
关于Java编程的动态特性,从认识的过程上要从 Reflection 到 instrumentation。

1. 初步的开发者刚接触到Reflection会非常兴奋,因为反射可以在运行时完成很多之前不可能的任务,这件利器使人打破了很多束缚。
2. Java Annotation出现后,更让Java变得更加有活力,更加友好。Annotation + Reflection + enum + Class Literal可以让过去比较难于完成的任务容易很多,这种初步的元驱动的方式毕竟打开了元驱动的新天地。
3.进入元驱动的世界,把Java语言,这种编译型语言,不再作为指令和数据的表达方式,而作为元数据的表达方式,开启了一种奇特的开发领域特定脚本语言的经历,这已经很酷了。
4. 毕竟Java Reflection还有自己的开销。不仅性能损耗是直接invoke发生的近1000倍,而且对于面向方面编程还需要引入动态代理和接口,虽然后者可能也不算什么,毕竟大家这样做很久了。但是Java还是提供了更加动态和简洁的方式,那就是Instrumentation,可以运行时在装载Class到ClassLoader的过程中进行字节码转换。这项技术被很多知名的编程框架所采用(有的是在编译时修改字节码), 比如EJB3.X, JPA persistence provider runtime eclipselink, Hibernate,无所不能的测试框架jmockit等等。

那么如何入门Instrumentation呢?

学习Instrumenation需要了解以下几个主要方面: 
1. JVM规范的bytecode的相关信息
2. JVM规范中Java Class Format 
3. Instrumation框架
4. 受欢迎的几个类库: Javassist, BCEL
5. 学习过程中使用到的工具: javap, eclipse的byte code visualizer, vim等等

如何上手?
1. 入手的时候,建议首先通过javap命令观察几个自己熟知的比较小一点的类,对于class文件中的概念有一些感性认识,比如Constant Pool,Code, ACC_XXX等等,命令如下:
 javap -v -l -p -c -s -constants /demo/standalone/ServiceOrder\$1.class
2. 看了几个类文件之后,可以看一个模拟JVM执行的demo。这是比较早期的一本非常知名的书籍作者编写的一系列的applet, 这些demo都在“深入Java虚拟机第二版CD.zip”这个文件中,如果你无法使用浏览器打开这些applet,那么你可以用jdk自带的appletviewer命令打开这些网页。比如其中有一个关于JVM模拟执行bytecode的例子, 可以了解到LocalVariableTable和Operand Stack以及PC的概念
    appletviewer EternalMath.html 
3. 比较有感觉了以后,建议学习IBM developerworks上的《Java编程的动态性》这套教程,一共8个部分,介绍了从Reflection到Instrumentation的过程(其中介绍的Javassist和BCEL在运行时都是基于Instrumentation)。动手做一些教程中的例子,建议采用编译目标定为1.6,避免出现一些错误。教程地址:
http://www.ibm.com/developerworks/cn/java/j-dyn0610/index.html

4. 有实际这方面需要的时候,在采用Javassist或者BCEL这种类库工具外,还要自己设计class转换前或者转换后的样式。那么这时候以下这些信息会派上用场:

a. vim -b xxxx.class, 进入vim后使用%!xxd以16进制对照ASCII码观察字节码
b. 前面提到的javap命令观察比较转换前后的区别,以及和目标的区别,通常目标是一个手工写的并且编译过的class文件
c. 也可以通过eclipse的一个插件byte code visualizer来查看,他提供了两个字节码查看器。一个是类似javap的重点查看方法byte code的,而另一个是类似vim -b + %!xxd的16进制对照字节码的,但是提供了更多的信息。
d. 剩下的就是要参考JVM规范了,其中两章很常用 ,分别是 Class File Format和 Java Virtual Machine Instruction Set


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 编程 reflection] 推荐:

Java编程的动态特性, 从Reflection到Runtime Class Transformation

- - 编程语言 - ITeye博客
关于Java编程的动态特性,从认识的过程上要从 Reflection 到 instrumentation. 初步的开发者刚接触到Reflection会非常兴奋,因为反射可以在运行时完成很多之前不可能的任务,这件利器使人打破了很多束缚. Java Annotation出现后,更让Java变得更加有活力,更加友好.

Java编程规范

- - Web前端 - ITeye博客
本文档的编写从简,绝大多数内容以条款或者表格形式列出,不做过多的补充说明,代码格式规范遵循eclipse的默认编码规范要求. •    简单,易执行. 1.    名字含义要明确,做到见名知义,如: User,Role, UserManager. 2.    尽量使用英文名字作为变量名,如果要使用中文,请写上备注.

Java并发编程基础

- - 并发编程网 - ifeve.com
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力. 如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善. 现代的PC都有多个CPU或一个CPU中有多个核. 是否能合理运用多核的能力将成为一个大规模应用程序的关键. 进程是以独立于其他进程的方式运行的,进程间是互相隔离的.

java编程风格指南

- - 行业应用 - ITeye博客
受不了的可以直接到以下网址查看. 作者:Hawstein 出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处.

面向GC的Java编程

- - 并发编程网 - ifeve.com
Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题. 以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧. 甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决.

java 并发编程 synchronized

- - Java - 编程语言 - ITeye博客
同步原语--synchronized. synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待.class与this做为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例.. ->线程各自获取monitor,不会有等待..

Java NIO编程的技巧和陷阱

- 小丑鱼 - 淘宝JAVA中间件团队博客
去年做的分享,一直上传slideshare失败,今天又试了下,成功了. 这个主题主要介绍Java NIO编程的技巧和陷阱,解读了一些NIO框架的源码,以及编写高性能NIO网络框架所需要注意的技巧和缺陷. 去年写了篇blog提供了pdf版本的下载,看这里.

JAVA接口编程的优点

- - ITeye博客
小弟刚工作两年文中所说都是通过自己工作中或做练习总结的经验,当然肯定不是那么准确,有不对之处望和谐指出,因为这个感觉完全是理论所以没有贴一段代码,有兴趣的就看看吧. 项目开发中绝对会碰到接口,但是为什么要使用接口成了绝大多数java程序员的疑问,为什么一定要写个没有实现任何功能的只有几个方名的类,可能也有一些人明白接口就是好,但好在哪里很难解释出来,我当初也是这样想的,但是当我一瞬间觉悟后发现这种想法很幼稚.

Java并发编程【1.2时代】

- - 并发编程网 - ifeve.com
         本文介绍了Java原生的多线程技术(1.2),通过详细介绍wait和notify相关的机制、基础的多线程技术以及基于这些技术的等待超时、线程间的通信技术和线程池高阶技术,最后通过一个基于线程池的简单文本web服务器—MollyServer,来阐明多线程带来好处. 通过介绍这些技术,展示了在没有使用Java并发包的时代(1.5-)是如何完成Java的多线程编程,为理解Java5提供了良好帮助.

Java 异步编程最佳实践

- - 鸟窝
最近异步编程非常流行, 主要是它能够在多核系统上提高吞吐率. 异步编程是一种编程方式,可以提高对UI的快速响应. Java中的异步编程模型提供了一致性的编程模型, 可以用来在程序中支持异步. 本文讨论了在使用Java执行异步操作应该遵循的最佳实践. 原文: Best Practices of Asynchronous Programming With Java.