快速业务通道

Java编程的动态性,第8部分: 用代码生成取代反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
[] INT_ARGS = { CtClass.intType }; protected byte[] createAccess(Class tclas, Method gmeth,    Method smeth, String cname) throws Exception {     // build generator for the new class     String tname = tclas.getName();     ClassPool pool = ClassPool.getDefault();     CtClass clas = pool.makeClass(cname);     clas.addInterface(pool.get("IAccess"));     CtClass target = pool.get(tname);     // add target object field to class     CtField field = new CtField(target, "m_target", clas);     clas.addField(field);     // add public default constructor method to class     CtConstructor cons = new CtConstructor(NO_ARGS, clas);     cons.setBody(";");     clas.addConstructor(cons);     // add public setTarget method     CtMethod meth = new CtMethod(CtClass.voidType, "setTarget",       new CtClass[] { pool.get("java.lang.Object") }, clas);     meth.setBody("m_target = (" + tclas.getName() + ")$1;");     clas.addMethod(meth);     // add public getValue method     meth = new CtMethod(CtClass.intType, "getValue", NO_ARGS,  clas);     meth.setBody("return m_target." + gmeth.getName() + "();");     clas.addMethod(meth);     // add public setValue method     meth = new CtMethod(CtClass.voidType, "setValue", INT_ARGS,  clas);     meth.setBody("m_target." + smeth.getName() + "($1);");     clas.addMethod(meth);     // return binary representation of completed class     return clas.toBytecode(); }

我不准备详细讨论这些代码,因为如果您一直跟着学习本系列,这里的大多数操作都是所 熟悉的(如果您 还没有 看过本系列,请现在阅读 第 5 部分,了解使用 Javassist 的概述 )。

Java编程的动态性,第8部分: 用代码生成取代反射(3)

时间:2011-04-09 IBM Dennis M. Sosnoski

用 BCEL 生成

用 BCEL 生成 清单 2 IAccess 的实现类不像使用 Javassist 那样容易,但是也不是很 复杂。清单 5 给出了相应的代码。这段代码使用与清单 4 Javassist 代码相同的一组操作 ,但是运行时间要长一些,因为需要为 BCEL 拼出每一个字节码指令。与使用 Javassist 时 一样,我将跳过实现的细节(如果有不熟悉的地方,请参阅 第 7 部分对 BCEL 的概述)。

清单 5. BCEL glue 类构造

/** Parameter types for call with single int value. */    private static final Type[] INT_ARGS = { Type.INT }; /** Utility method for adding constructed method to class. */ private static void addMethod(MethodGen mgen, ClassGen cgen) {    mgen.setMaxStack();    mgen.setMaxLocals();    InstructionList ilist = mgen.getInstructionList();    Method method = mgen.getMethod();    ilist.dispose();    cgen.addMethod(method); } protected byte[] createAccess(Class tclas,    java.lang.reflect.Method gmeth, java.lang.reflect.Method smeth,    String cname) {    // build 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号