Classworking 工具箱: ASM classworking

ASM classworking 库声称自己又小又快是否名符其实?用 ASM 2.0 测试一下就知道。

简介:在这一期的 Classworking 工具箱中,咨询顾问 Dennis Sosnoski 把 ASM 字节码操作框架与 他以前在 Java 编程动态性系列中讨论过的字节码工程库(Byte Code Engineering Library,BCEL)以 及 Javassist 框架进行比较。ASM 声称自己又小又快 —— 但将它与其他框架进行比较的情况如何样呢 ? Dennis 将采用他在以前系列文章中使用的示例对 ASM 的可用性和性能进行评估。

目前已经开发了若干个处理字节码和类文件的 Java 库,其中包括我在以前的 Java 编程动态性 系列 中介绍的 Javassist 和 BCEL 库。ASM 是这种类型的另一个更新的库。与其他库不同,ASM 被设计和实 现为尽可能小而快。在本月的这一期文章中,我将深入研究 ASM 在这一点上做得到底如何,将它与其他 两个用作本系列中的示例的库进行比较。

在上一期文章中,我演示了如何用运行时字节码生成来代替反射。那次,我使用了 1.4.1 的 JVM 进 行测试,结果发现,生成的代码运行起来可能要比它替换的反射代码更快。除了在 ASM 上采用同样的手 段进行测试之外,在这一期中,我还更新了结果,用 1.5.0 的 JVM 进行测试,看看 1.5.0 中实现的性 能增强是否会改变结果。

代替反射

示例应用程序的目的是用运行时生成的代码代替反射。 在我的 Java 编程动态性 系列中,我已经深入介绍过这个主题。在这一期的文章中,我将对以前的材料 做一个快速的背景总结,然后看看在使用 ASM 代替 Javassist 和 BCEL 框架时,与这两者相比,ASM 的 性能和可用性如何。

设置阶段

反射为在运行时访问对象和元数据提供了非常强大的机制( 正如我在“Java 编程动态性,第 2 部分” 中讨论过的)。使用反射使构建应用程序更加灵 活,可以在运行时用外部信息把各个片断挂接(hook)在一起,形成一个工作配置。但是利用反射来实际 访问对象通常比直接执行相同的操作慢得多。使用基于反射的方法构建应用程序,而后发现需要改进性能 ,这样会带来真正的问题,因为反射支持的灵活性很难以其他方式做到。

Classworking 技术提供 了一种方法。它没有使用反射来访问对象的属性,例如,可以在运行时构建一个类来做同样的事 —— 但这样做会快许多。“Java 编程动态性,第 8 部分”演示了如何用 Javassist 和 BCEL 这两个 classworking 框架来实现这种类型的反射替代。这篇文章采用的基本原则很 简单:首先创建一个接口(该接口定义所需的函数),然后在运行时构建一个类(该类实现前面的接口, 并把函数挂接到目标对象上)。

清单 1 演示了这种方法。在这里,HolderBean 类包含一对属性 ,通过使用反射来调用 get 和 set 方法,可以在运行时访问这一对属性。IAccess 接口抽象化了通过 get 和 set 方法访问 int 值属性的概念,而 AccessValue1 类则特别针对 HolderBean 类的 “value1”属性给出了这个接口的实现。

清单 1. 反射替代接口和实现

public class HolderBean
{
  private int m_value1;
   private int m_value2;

  public int getValue1( {
    return  m_value1;
  }
  public void setValue1(int value) {
    m_value1  = value;
  }

  public int getValue2() {
    return  m_value2;
  }
  public void setValue2(int value) {
    m_value2  = value;
  }
}
public interface IAccess
{
  public void  setTarget(Object target);
  public int getValue();
  public void  setValue(int value);
}
public class AccessValue1 implements IAccess
{
  private HolderBean m_target;

  public void setTarget(Object target)  {
    m_target = (HolderBean)target;
  }
  public int getValue () {
    return m_target.getValue1();
  }
  public void setValue (int value) {
    m_target.setValue1(value);
  }
}

如果 不得不手工编码诸如清单 1 中的 AccessValue1 那样的每个实现类,那么整个方法可能都不是很有用。 但是 AccessValue1 中的代码非常简单,这使它成为运行时类生成的理想目标。可以使用 AccessValue1 字节码作为模板,以生成特定于具体目标对象类型和 get/set 方法对的类,只要用这些目标替换掉 AccessValue1 中使用的那些目标即可。这是我在以前的文章中使用的方法,也是我在这一期中用在 ASM 上的方法。

时间: 2024-10-30 07:43:33

Classworking 工具箱: ASM classworking的相关文章

Classworking 工具箱: 泛型与ASM

了解如何使用 ASM 字节码框架从 Java 5 中访问泛型信息 简介:Java 5 泛型提供了对于许多 classworking 都非常有用的信息.尽管 Java 反射可用 于为载入的类获取泛型信息,但要求类必须载入到 JVM 中,这是一个很大的缺点.在本文中, classworking 精神领袖 Dennis Sosnoski 展示了 ASM Java 字节码操纵框架怎样在无需经过 Java classloading 处理的情况下提供对泛型信息的灵活访问.在文中,他还深入探讨了泛型的二进制类

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

到 J2SE 5.0,Sun 已经给 Java 平台添加了许多新特性.最为重要的一个新特性是支持注释.注释在关联多种类型的元数据与 Java 代码方面将会很有用,并且在扩展 Java 平台的新的和更新的 JSR 中,它已经被广泛用来代替定制配置文件.在本文中,我将向您展示如何结合使用 ASM 字节码操作框架和 J2SE 5.0 的新增特性 -- instrumentation 包 -- 来在类被加载到 JVM 中时,按照注释的控制来转换类. 注释基础知识 讨论 J2SE 5.0 注释的文章已经很

Classworking工具箱: 将aspect放到werk中

aspect 可以清除代码污染吗?使用 AspectWerkz 框架进行日志记录是第一步 简介:面向方面编程(Aspect-oriented programming,AOP)通过将在应用程序范围内起作用的功能 分离出来而不是放到某个类或者包中,可以使代码保持清洁.日志记录是这种功能的一个常用的例子. AOP 是否可以帮助进行日志记录?在本文中,开发人员和 AOP 拥护者 Dennis Sosnoski 对 AspectWerkz 框架的使用进行分析以找出答案. 在我的关于 Java 编程动态性

Classworking工具箱: 分析泛型数据结构

应用类型替换深入挖掘使用泛型的程序的细节 简介:Java 5 泛型把详细的类型信息编码到类文件中.许多类型的工具都可以从全面的类型 信息提供的改进的数据结构中受益,但是要把这个信息变成有用的形式可能有些困难.为了让这个工作更 容易些,系列作者 Dennis Sosnoski 围绕 ASM Java 字节码操纵框架构建了一个数据结构分析程序,可 以解释泛型信息,为应用程序使用的数据的实际数据类型创建深度的视图. 类处理工具实际上就是一个把其他程序当成数据的程序,通常会修改或重新塑造目标程序,以满足

oracle:ASM简单管理

一.ASM磁盘和磁盘组管理 1.创建磁盘组 create diskgroup DG2 EXTERNAL REDUNDANCY DISK 'ORCL:A1′; Note:1)磁盘名称需要大写 2)磁盘名称使用V$asm_disk.path 2.磁盘组中添加磁盘 alter diskgroup dg2 add disk 'ORCL:A2′; Note:磁盘名称使用V$asm_disk.path 3.磁盘组中删除磁盘 alter diskgroup dg2 drop disk 'a1′; Note:磁

前端的小玩意(9.5)——做一个仿360工具箱的web页面(完结篇,可以跑起来的工具箱)

DEMO网址: http://jianwangsan.cn/toolbox (五)添加.点击和移动的逻辑 我反思了一下,在(四)中我写的并不好,事实上,无论是大按钮,还是被添加到我的工具,或者是添加到常用工具栏,他都是一个按钮,因此,应该共享状态,即他们属于同一个tool实例,并能互相影响.   需求分析: 在重写Tool类之前,需要明确分析按钮的逻辑. 在全部工具页面: ①当按钮未被添加时,鼠标移动上去会有添加按钮显示: ②当按钮未被添加时,鼠标无论点击按钮本身还是点击添加按钮,都执行添加逻辑

迁移数据文件到ASM【转】

1.迁移数据文件到ASM 1)数据库一致性情况下迁移: 将数据库启动到mount状态,生成rman copy 语句,然后在rman中执行: SQL> startup mount SQL> select q'(copy datafile ')'||name||q'(' to '+oradata';)' from v$datafile; Q'(COPYDATAFILE')'||NAME||Q'('TO'+ORADATA';)' -----------------------------------

被迫尝试了各个版本的asm库读取类annotation

杯具的写完代码才发现应用原来依赖的cglib使用了1.x的asm库,从最初使用3.x版本到2.x,然后使用1.x才搞定asm的兼容性.这里记录下不同版本如何读取annotation. asm3.2: 这个版本非常方便,实现ClassVisitor接口,里面有个visitAnnotation方法,方法签名是: AnnotationVisitor visitAnnotation(String desc, boolean visible) ,其中desc是annotation的类型(Lxxx/xxx/

产品经理的使用工具:讨论产品经理的工具箱

文章描述:产品经理的工具箱,放些啥?. 今天在网上看到一个讨论话题"产品经理的工具箱,放些啥 ? 网友问题: 请分别回答三个问题.我是开发人员,今天产品经理跟我说非常想有一个在iPad上展示Axure生成的原型的工具(也就是本地HTML浏览器).我突然想到这是不是一个好的创意:做一个在iPad上创建并展示原型的工具.iPad携带方便,待机时间长.单做一个本地HTML浏览器没多大意义.或者做一个原型展示工具,可以展示产品经理常用的模型工具生成的文件. 部分网友回答: 小光: ipad上已经有好多原