0 0

javassist能动态改变方法的返回对象么?0

在mybatis3的MappedStatement类中有个public BoundSql getBoundSql(Object parameterObject)方法,我希望该方法在运行时返回我生成的BoundSql 对象而不是这个方法原生的对象。javassist能行么。我在网上摘了些代码运行不过去
// 用于取得字节码类,必须在当前的classpath中,使用全称
CtClass ctClass = ClassPool.getDefault().get("org.apache.ibatis.mapping.MappedStatement");
// 需要修改的方法名称
String mname = "getBoundSql";
CtMethod mold = ctClass.getDeclaredMethod(mname);
// 修改原有的方法名称
String nname = mname + "$impl";
mold.setName(nname);
// 创建新的方法,复制原来的方法
CtMethod mnew = CtNewMethod.copy(mold, mname, ctClass, null);
// 主要的注入代码
StringBuffer body = new StringBuffer();
body.append("{return "+newBoundSql);
// 调用原有代码,类似于method();($$)表示所有的参数
//body.append(nname + "($$);\n");
//body.append("System.out.println(\"Call to method " + mname + " took \" +\n (System.currentTimeMillis()-start) + " + "\" ms.\");\n");

body.append("}");
// 替换新方法
mnew.setBody(body.toString());
// 增加新方法
ctClass.addMethod(mnew);
return  (MappedStatement) ctClass.toClass().newInstance();
 
2014年5月24日 00:14

1个答案 按时间排序 按投票排序

0 0

采纳的答案

他只是在原来的基础上包装了一层,然后在返回你定义的类型是可以的

2014年5月24日 08:51

相关推荐

    javassist官方手册(中文)

    如果一个 CtClass 对象通过 writeFile(), toClass(), 或 toBytecode() 方法被转换为类文件,Javassist 就冻结了此对象。对此 CtClass 对象的后续修改都是不允许的。这是为了警告那些试图修改已经被加载的类文件的...

    动态代理-jdk、cglib、javassist.zip

    动态代理在Java编程中是一种非常重要的技术,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,为对象添加额外的功能。本压缩包包含关于三种主要的动态代理实现方式:JDK动态代理、CGLIB以及...

    javassistDemo.zip

    总结来说,"javassistDemo.zip"是一个实践教程,通过实例演示了如何使用Javaassist库来动态修改Java类,包括插入新的方法和改变方法的实现。这对于理解和掌握Java运行时代码修改技术,尤其是对于那些需要在运行时...

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    java 反编译工具 jboss-javassist

    2. **类转换**:它允许开发者在运行时修改类的方法体,例如添加新的方法、修改现有方法的实现,甚至改变类的结构,如添加或删除字段。 3. **代码解析与生成**:Javassist提供了一套API,可以将Java源代码字符串转换...

    Javassist学习手册

    Javassist 是一款功能强大的 Java 字节码操作工具库,它可以动态地修改类结构、方法体等,从而实现类的增强、代理等功能。这对于框架开发、AOP、动态代理等领域具有重要意义。本文将详细介绍 Javassist 的基本概念、...

    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    Proxy类用于创建动态代理对象,而InvocationHandler接口则定义了对代理对象方法调用的处理逻辑。使用JDK动态代理,我们需要实现InvocationHandler接口,然后通过Proxy类的newProxyInstance方法创建代理对象。这个...

    Javassistjar包

    avassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 ...直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

    javassist demo

    Javaassist提供了一套API,可以用来创建新的类,修改现有类的方法和字段,甚至在运行时改变类的行为。以下是一些关键知识点: 1. **类的加载与创建**:Javaassist通过`ClassPool`对象来管理类的加载。你可以使用`...

    javassist+jd-gui

    这个工具的强大之处在于,它提供了一种无需重新编译源代码就能改变Java类行为的方式。通过`javassist`,开发者可以实现如插桩(AOP)、代码热更新、字节码级别的调试等多种功能。`javassist` 提供了类似于 Java 的...

    agent+javassist例子

    5. **动态代理**:`javassist`可以用来创建动态代理类,拦截并修改方法调用,实现事务管理、权限控制等功能。 6. **调试辅助**:在开发过程中,可以动态插入日志语句,帮助理解代码的运行过程。 总的来说,`agent+...

    基于javassist调用方法.zip_动态编码_快速反射

    以下是一个简单的例子,展示了如何使用`javassist`动态创建一个类并添加一个方法: ```java import javassist.*; public class JavassistExample { public static void main(String[] args) throws ...

    javassist-3.14.0-GA

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶...直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

    javassist-3.20.0-GA.zip

    例如,如果你想添加一个方法到已有的类,你可以首先获取`CtClass`对象,然后创建`CtMethod`对象,定义方法的签名和体,最后调用`CtClass`的`addMethod()`方法。同样,如果你想修改已有方法,可以通过`CtClass`的`...

    javassistDemo

    2. ** CtClass对象**:`CtClass`是表示Java类的动态表示,你可以通过它来访问类的方法、字段和构造函数,并进行修改。例如,你可以添加新的方法、字段,或者修改已有的方法体。 3. **字节码操作**:Javaassist通过`...

    javaagent+javassist

    Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...

    javassist-3.23.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javassist-3.19.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.19.0-GA.jar; 赠送原API文档:javassist-3.19.0-GA-javadoc.jar; 赠送源代码:javassist-3.19.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.19.0-GA.pom; 包含翻译后的API文档...

    Javassist18版20版22版的jar包

    - 测试工具:单元测试框架可能会使用Javassist来模拟方法或改变类的行为。 4. **使用示例**: - 创建新类: ```java CtClass ctClass = ClassPool.getDefault().makeClass("com.example.NewClass"); ``` - ...

    javassist-3.21.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

Global site tag (gtag.js) - Google Analytics