`
barryzhong
  • 浏览: 21378 次
  • 性别: Icon_minigender_1
社区版块
存档分类

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

 
阅读更多
关于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
  • 大小: 701.7 KB
分享到:
评论

相关推荐

    Informatica Java Transformation

    【Informatica Java Transformation】是Informatica PowerCenter中一个强大的特性,它允许开发人员利用Java编程语言来处理数据转换。在数据集成过程中,当标准的Informatica转换无法满足复杂或特定需求时,Java ...

    kettle集成应用之---java调用执行transformation和job

    kettle是一款功能强大的数据集成工具,可以在java应用程序中集成应用,实现调用资源库上和本地的transformation和job。下面是kettle集成应用的详细知识点: 一、kettle资源库的配置 kettle中的Repository是存储元...

    fab-transformation.zip

    从描述来看,这个压缩包包含的可能是Java源码,用于创建或修改Android APK应用的代码,可能涉及到Android应用的构建过程或者界面元素的变换。 "JavaApk源码说明.txt"很可能是一个文档,提供了关于源码的详细信息,...

    java xml编程指南

    Java XML编程指南主要涵盖的是如何在Java环境中处理XML(可扩展标记语言)文档的技术和方法。XML作为一种数据交换和存储格式,广泛应用于不同系统之间的数据交互,如Web服务、配置文件、数据序列化等。本指南将深入...

    java程序生成kettle转换ktr文件

    Java程序生成Kettle转换(KTR)文件是一个技术性较强的话题,主要涉及到Java编程语言、Kettle(也称为Pentaho Data Integration,PDI)工具以及可能的资源文件管理。Kettle是一种开源的数据集成工具,它允许用户通过...

    Informatica Union Transformation组件 详解

    在 mapping 中使用 Union Transformation,可以连接多个输入组,从不同的分支,在一个 pipeline 或者不同 pipeline。当你添加一个 Union Transformation 到 mapping,你必须检查你连接的所有输入组的同一个 port。...

    Java XML编程指南

    Java XML编程指南主要涵盖了在Java平台上使用XML技术进行开发的各种概念和实践方法。XML(Extensible Markup Language)是一种用于标记数据的语言,它被广泛应用于数据交换、配置存储以及Web服务等场景。Java作为...

    java调用kettle示例

    Kettle(也称为Pentaho Data Integration或PDI)是一款强大的ETL(Extract, Transform, Load)工具,它允许用户通过图形化界面设计数据转换流程,并能被其他应用程序如Java程序调用执行这些流程。在本示例中,我们将...

    java调用kettle所需jar包(包含oracle和mysqljar驱动).rar

    Java调用Kettle是将Java程序与Pentaho Kettle(也称为Spoon)集成的过程,Kettle是一款强大的数据转换和ETL(提取、转换、加载)工具。在这个过程中,Java代码通过调用Kettle的相关API来执行转换或作业,实现数据...

    魔方java源代码.pdf

    魔方java源代码.pdf 文件提供了一个完整的 Java 3D 魔方程序设计的实现,涵盖了 Java 3D 编程的多个方面,包括场景图、变换、动画、交互、图形学等。本文将对该程序进行详细的分析,并对其中涉及的知识点进行解释。 ...

    JAVA 特殊效果案例

    在JAVA编程语言中,开发者可以利用其丰富的API和强大的功能实现各种特殊效果,为应用程序增添趣味性和互动性。本篇文章将深入探讨JAVA实现的五个特殊效果案例:彩蛋、画图、身份证转换、时钟以及字体线程。这些案例...

    Java and XML, 3rd Edition

    它将教您如何使用XML的各种应用程序编程接口(API)、工具和技巧来构建实际的应用程序,为管理从配置文件到网络站点在内的所有信息提供一条全新的途径。 本书的前两章回顾有关XML的基础知识,包括XPath、XSL、DTD...

    kettle集成java+完整jar包

    - 分离业务逻辑:在Java中处理业务规则,而在Kettle中处理数据转换,两者相结合,既能发挥Java的强类型和面向对象特性,也能利用Kettle的数据处理能力。 - 错误处理:确保在集成中包含适当的错误处理机制,如日志...

    kettle动态设置输入文件路径

    【标题】"Kettle动态设置输入文件路径"指的是在Pentaho Data Integration(简称Kettle,也称为Spoon)工具中,如何根据特定条件或变量动态地设定数据处理过程中的输入文件路径。Kettle是一个开源的数据集成平台,...

    Kettle API - Java调用示例

    通过这个示例,我们可以了解到Kettle API在Java应用程序中实现ETL流程的强大能力,包括创建自定义的数据流,管理数据库交互,以及控制Transformation的生命周期。这为开发者提供了灵活的方式,能够根据业务需求构建...

    coordinate-transformation.zip_TRANSFORMATION_坐标转换程序

    《坐标转换程序详解——以"coordinate-transformation.zip_TRANSFORMATION_坐标转换程序"为例》 在IT领域,坐标转换是一项至关重要的技术,特别是在地理信息系统(GIS)、遥感、导航以及计算机图形学等多个领域中...

    Windows 7 Transformation Pack 3.0[Windows 7 完全仿真器]

    这款工具的主要目的是为了让用户能够在不进行系统升级的情况下,享受到Windows 7的视觉风格和部分功能特性。 1. **界面仿真**:该工具的核心功能是改变用户的桌面体验,包括但不限于桌面壁纸、窗口边框、图标、登录...

    快速傅里叶变换 FFT (Fast Fourier Transformation)介绍,包含java和C++实现

    它极大地减少了计算复杂度,从DFT的O(n^2)降低到O(n log n)。 ### 一、复数基础 复数是数学中的基本概念,形式为z = a + bi,其中a和b是实数,i是虚数单位,满足i^2 = -1。复数可以用极坐标形式表示为z = r(cosθ +...

    java调用Kettle引用jar包2.zip

    Java调用Kettle是将Java程序与Pentaho Kettle(也称为Spoon)集成的过程,Kettle是一款强大的数据转换和ETL(提取、转换、加载)工具。在Java环境中,我们可以通过API来启动和控制Kettle的工作流或转换。这个压缩包...

    JAVA与XML.rar

    它将教您如何使用XML的各种应用程序编程接口(API)、工具和技巧来构建实际的应用程序,为管理从配置文件到网络站点在内的所有信息提供一条全新的途径。 本书的前两章回顾有关XML的基础知识,包括XPath、XSL、DTD以及...

Global site tag (gtag.js) - Google Analytics