`
i2534
  • 浏览: 182526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javassist创建类并添加方法

    博客分类:
  • util
阅读更多

无聊,发现很多项目都有javassist这个包,做了个demo,创建一个临时类有时还挺有用的.

 

ClassPool cp = ClassPool.getDefault();
		try {
			CtClass cc = cp.makeClass("Tester");
			CtMethod cm = new CtMethod(CtClass.intType, "add", new CtClass[] {
					CtClass.intType, CtClass.intType }, cc);
			cm.setBody("return $1 + $2;");
			cm.insertAfter("for(int i=0;i<$args.length;i++)"
					+ "{System.out.println(\"args[\"+i+\"]=\"+$args[i]);}");
			cc.addMethod(cm);
			Class<?> c = cc.toClass();
			Object o = c.newInstance();
			Method m = c.getDeclaredMethod("add", int.class, int.class);
			System.out.println("Result:" + m.invoke(o, 1, 2));
		} catch (CannotCompileException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}

 

运行结果:

args[0]=1
args[1]=2
Result:3

分享到:
评论

相关推荐

    javassist官方手册(中文)

    Point 的成员方法可以通过 CtNewMethod 的工厂方法创建出来并通过 CtClass 的 addMethod() 方法添加到 Point 类中。 五、冻结类 如果一个 CtClass 对象通过 writeFile(), toClass(), 或 toBytecode() 方法被转换为...

    javassistDemo.zip

    这个"javassistDemo.zip"压缩包提供了一个示例,展示了如何利用Javaassist库动态修改Java类的方法。在Java应用程序中,这种能力非常有用,特别是在进行AOP(面向切面编程)或者在无法重新编译源代码的情况下需要修改...

    java 反编译工具 jboss-javassist

    3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来添加、修改或删除类的字段和方法。 4. **处理方法体**:使用`CtMethod`可以获取或修改方法体,包括插入、替换或删除代码。 5. *...

    Javassist学习手册

    - **添加方法**: 可以使用 `CtNewMethod` 工厂方法创建新的方法,然后使用 `CtClass.addMethod(CtMethod method)` 添加到类中。 - **创建接口**: 如果想要创建接口而不是类,则应使用 `ClassPool.makeInterface...

    javassist demo

    8. **转换与编译**:`toClass()`方法将`CtClass`对象转换为实际的Java类,并加载到JVM中。如果你需要将修改保存到磁盘,可以使用`toBytecode()`生成字节码,然后用`ClassFile`对象写入文件。 9. **异常处理**:Java...

    javassist-3.20.0-GA.zip

    如果需要添加注解,可以创建`CtAnnotation`对象并调用`addAnnotation()`方法。 在3.20.0-GA版本中,Javaassist已经稳定且成熟,可以很好地兼容JDK8的特性。如果你的项目仍在使用JDK8,那么这个版本是一个很好的选择...

    javaagent+javassist

    开发者无需理解复杂的字节码格式,只需使用javassist提供的API,就可以轻松地添加、删除或修改类的方法、字段甚至整个类。这使得javassist成为单元测试框架、AOP(面向切面编程)和动态代理实现的理想工具。 将`...

    javassistDemo

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

    agent+javassist例子

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

    javassist-3.15.0-GA

    2. ** CtClass**: 表示一个类,提供了访问和修改类结构的方法,如添加字段、方法,修改已有字段、方法的签名和实现等。 3. ** CtMethod**: 用于表示和修改方法,你可以查看方法的参数、返回类型,甚至插入或替换...

    Javassist18版20版22版的jar包

    - 类的动态修改:Javassist提供了一种简单的方式来修改类的方法、字段,甚至可以在运行时添加新的方法或字段。 - 字节码操作:它允许用户通过CtClass接口来操作字节码,CtClass对象代表一个类的字节码表示。 - ...

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

    使用javassist创建动态代理的基本流程: 1. 加入javassist库。 2. 使用ClassPool获取或创建类池。 3. 通过CtClass对象表示要代理的类,并实现需要的方法。 4. 使用CtClass的toClass方法生成代理类。 5. 创建代理类的...

    jboss-javassist和JByteMode整合包

    2. 提供了修改已编译类的方法,包括修改方法体、添加新方法等。 3. 可以直接在内存中操作字节码,无需重新编译源代码。 **jbosss-javassist整合** 在“jbosss-javassist”项目中,这两个库被整合起来,以提供更加...

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

    在Javassist中,我们可以通过`javassist.ClassPool`,`javassist.CtClass`,`javassist.CtMethod`等类来创建和修改类及方法。 **ASM**: ASM是一个底层的Java字节码操控和分析框架,它可以用来动态生成类或者增强已...

    javassist.jar源码

    这个库在Java编程中尤其有用,因为它允许程序员在不重新编译源代码的情况下修改、添加或删除类和方法。`javassist-3.7.ga.jar`是Javaassist的一个版本,ga代表“General Availability”,意味着这是一个稳定版本,...

    javassist-3.7.ga.jar下载

    2. 类转换:通过`ClassPool`对象,你可以加载类并对其进行修改,如添加方法、字段或注解,甚至改变类的结构。 3. 动态代理:与Java的`java.lang.reflect.Proxy`相比,Javaassist的动态代理更为灵活,因为它可以在...

    运用javassist和annotation修改class的特定method的class byte code

    例如,我们可以创建新的类,添加字段,定义方法,甚至修改已存在的类。这通过`ClassPool`、`CtClass`、`CtMethod`等核心类实现。 对于注解,它们是元数据的一种形式,可以附加到Java源代码的不同元素(如类、方法、...

    javassist-3.7.ga.jar

    ` CtClass` 是 Javaassist 中处理类的核心接口,你可以用它来访问类的方法、字段,并进行修改。 2. **方法和字段操作**:`CtMethod` 和 `CtField` 分别用于表示和操作方法和字段。你可以添加、删除、修改方法的代码...

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

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

Global site tag (gtag.js) - Google Analytics