无聊,发现很多项目都有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
分享到:
相关推荐
Point 的成员方法可以通过 CtNewMethod 的工厂方法创建出来并通过 CtClass 的 addMethod() 方法添加到 Point 类中。 五、冻结类 如果一个 CtClass 对象通过 writeFile(), toClass(), 或 toBytecode() 方法被转换为...
这个"javassistDemo.zip"压缩包提供了一个示例,展示了如何利用Javaassist库动态修改Java类的方法。在Java应用程序中,这种能力非常有用,特别是在进行AOP(面向切面编程)或者在无法重新编译源代码的情况下需要修改...
3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来添加、修改或删除类的字段和方法。 4. **处理方法体**:使用`CtMethod`可以获取或修改方法体,包括插入、替换或删除代码。 5. *...
- **添加方法**: 可以使用 `CtNewMethod` 工厂方法创建新的方法,然后使用 `CtClass.addMethod(CtMethod method)` 添加到类中。 - **创建接口**: 如果想要创建接口而不是类,则应使用 `ClassPool.makeInterface...
8. **转换与编译**:`toClass()`方法将`CtClass`对象转换为实际的Java类,并加载到JVM中。如果你需要将修改保存到磁盘,可以使用`toBytecode()`生成字节码,然后用`ClassFile`对象写入文件。 9. **异常处理**:Java...
如果需要添加注解,可以创建`CtAnnotation`对象并调用`addAnnotation()`方法。 在3.20.0-GA版本中,Javaassist已经稳定且成熟,可以很好地兼容JDK8的特性。如果你的项目仍在使用JDK8,那么这个版本是一个很好的选择...
开发者无需理解复杂的字节码格式,只需使用javassist提供的API,就可以轻松地添加、删除或修改类的方法、字段甚至整个类。这使得javassist成为单元测试框架、AOP(面向切面编程)和动态代理实现的理想工具。 将`...
2. ** CtClass对象**:`CtClass`是表示Java类的动态表示,你可以通过它来访问类的方法、字段和构造函数,并进行修改。例如,你可以添加新的方法、字段,或者修改已有的方法体。 3. **字节码操作**:Javaassist通过`...
5. **动态代理**:`javassist`可以用来创建动态代理类,拦截并修改方法调用,实现事务管理、权限控制等功能。 6. **调试辅助**:在开发过程中,可以动态插入日志语句,帮助理解代码的运行过程。 总的来说,`agent+...
2. ** CtClass**: 表示一个类,提供了访问和修改类结构的方法,如添加字段、方法,修改已有字段、方法的签名和实现等。 3. ** CtMethod**: 用于表示和修改方法,你可以查看方法的参数、返回类型,甚至插入或替换...
- 类的动态修改:Javassist提供了一种简单的方式来修改类的方法、字段,甚至可以在运行时添加新的方法或字段。 - 字节码操作:它允许用户通过CtClass接口来操作字节码,CtClass对象代表一个类的字节码表示。 - ...
使用javassist创建动态代理的基本流程: 1. 加入javassist库。 2. 使用ClassPool获取或创建类池。 3. 通过CtClass对象表示要代理的类,并实现需要的方法。 4. 使用CtClass的toClass方法生成代理类。 5. 创建代理类的...
2. 提供了修改已编译类的方法,包括修改方法体、添加新方法等。 3. 可以直接在内存中操作字节码,无需重新编译源代码。 **jbosss-javassist整合** 在“jbosss-javassist”项目中,这两个库被整合起来,以提供更加...
在Javassist中,我们可以通过`javassist.ClassPool`,`javassist.CtClass`,`javassist.CtMethod`等类来创建和修改类及方法。 **ASM**: ASM是一个底层的Java字节码操控和分析框架,它可以用来动态生成类或者增强已...
这个库在Java编程中尤其有用,因为它允许程序员在不重新编译源代码的情况下修改、添加或删除类和方法。`javassist-3.7.ga.jar`是Javaassist的一个版本,ga代表“General Availability”,意味着这是一个稳定版本,...
2. 类转换:通过`ClassPool`对象,你可以加载类并对其进行修改,如添加方法、字段或注解,甚至改变类的结构。 3. 动态代理:与Java的`java.lang.reflect.Proxy`相比,Javaassist的动态代理更为灵活,因为它可以在...
例如,我们可以创建新的类,添加字段,定义方法,甚至修改已存在的类。这通过`ClassPool`、`CtClass`、`CtMethod`等核心类实现。 对于注解,它们是元数据的一种形式,可以附加到Java源代码的不同元素(如类、方法、...
` CtClass` 是 Javaassist 中处理类的核心接口,你可以用它来访问类的方法、字段,并进行修改。 2. **方法和字段操作**:`CtMethod` 和 `CtField` 分别用于表示和操作方法和字段。你可以添加、删除、修改方法的代码...
以下是一个简单的例子,展示了如何使用`javassist`动态创建一个类并添加一个方法: ```java import javassist.*; public class JavassistExample { public static void main(String[] args) throws ...