快速业务通道

Classworking 工具箱: ASM classworking - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
n",  "Lgen/HolderBean;", null, null); fv.visitEnd(); } { mv =  cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object",  "<init>", "()V"); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "setTarget",  "(Ljava/lang/Object;)V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD,  0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, "gen/HolderBean"); mv.visitFieldInsn(PUTFIELD, "gen/AccessValue1", "m_bean", "Lgen/HolderBean;"); mv.visitInsn(RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); } { mv  = cw.visitMethod(ACC_PUBLIC, "getValue", "()I", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "gen/AccessValue1",  "m_bean", "Lgen/HolderBean;"); mv.visitMethodInsn(INVOKEVIRTUAL, "gen/HolderBean",  "getValue1", "()I"); mv.visitInsn(IRETURN); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "setValue", "(I)V",  null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "gen/AccessValue1", "m_bean", "Lgen/HolderBean;"); mv.visitVarInsn(ILOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "gen/HolderBean",  "setValue1", "(I)V"); mv.visitInsn(RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); } }

重新格式化之后,清单 2 的代码就成为了我们下面要查看的反射替代代码的基础。

Classworking 工具箱: ASM classworking(3)

时间:2011-10-16 IBM Dennis M. Sosnoski

用 ASM 代替反射

“Java 编程动态性,第 8 部分” 采用了一个基类,对代码 生成代替反射的不同实现进行测试,其中每个 classworking 库都用独立的子类来扩展基类。我将采用同 样的方法来测试 ASM。

清单 3 给出了 ASM 实现的子类。反射替代类的构造是通过 createAccess() 方法完成的,该方法基于 清单 2 中 ASM 生成的代码。清单 3 中的代码与清单 2 中代 码的主要区别是:我对清单 3 的格式和结构稍加了重新调整,而且还调整了目标类的参数,属性的 get 和 set 方法,以及生成的类名称,以便这个 ASM 版本的 createAccess() 方法与以前文章中使用的 Javassist 和 BCEL 版本兼容。

清单 3. ASM 测试类

public class ASMCalls  extends TimeCalls {   protected byte[] createAccess(Class tclas, Method  gmeth, Method smeth,     String cname) throws Exception {      // initialize writer for new class     String ciname = cname.replace(''.'',  ''/'');     ClassWriter cw = new ClassWriter(false);     cw.visit (Opcodes.V1_2, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,       cname, null,  "java/lang/Object", new String[] { "gen/IAccess" });     // add  field definitio

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号