最近学习了javassist的使用方法。
javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等。
下面是如果用javassist来动态创建一个类的demol
我们需要创建的目标类,如下:
public class JavassistClass{
private String name="default";
public JavassistClass(){
name="me";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void execute(){
System.out.println(name);
System.out.println("execute ok");
}
}
如下为用javassist来创建类的代码:
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtField.Initializer;
import javassist.CtMethod;
import javassist.CtNewMethod;
public class JavassistLearn{
public static void main(String[] args) throws Exception{
ClassPool cp=ClassPool.getDefault();
CtClass ctClass=cp.makeClass("com.slovef.JavassistClass");
StringBuffer body=null;
//参数 1:属性类型 2:属性名称 3:所属类CtClass
CtField ctField=new CtField(cp.get("java.lang.String"), "name", ctClass);
ctField.setModifiers(Modifier.PRIVATE);
//设置name属性的get set方法
ctClass.addMethod(CtNewMethod.setter("setName", ctField));
ctClass.addMethod(CtNewMethod.getter("getName", ctField));
ctClass.addField(ctField, Initializer.constant("default"));
//参数 1:参数类型 2:所属类CtClass
CtConstructor ctConstructor=new CtConstructor(new CtClass[]{}, ctClass);
body=new StringBuffer();
body.append("{\n name=\"me\";\n}");
ctConstructor.setBody(body.toString());
ctClass.addConstructor(ctConstructor);
//参数: 1:返回类型 2:方法名称 3:传入参数类型 4:所属类CtClass
CtMethod ctMethod=new CtMethod(CtClass.voidType,"execute",new CtClass[]{},ctClass);
ctMethod.setModifiers(Modifier.PUBLIC);
body=new StringBuffer();
body.append("{\n System.out.println(name);");
body.append("\n System.out.println(\"execute ok\");");
body.append("\n return ;");
body.append("\n}");
ctMethod.setBody(body.toString());
ctClass.addMethod(ctMethod);
Class<?> c=ctClass.toClass();
Object o=c.newInstance();
Method method=o.getClass().getMethod("execute", new Class[]{});
//调用字节码生成类的execute方法
method.invoke(o, new Object[]{});
}
}
javassist还有一个比较常见的用途是AOP,比如对一些类统一加权限过滤,加日志监控等等。
下面示例如何使用javassist来进行AOP拦截处理
我们对上面例子的JavassistClass类的getName()方法进行拦截前置处理
package com.taobao.relationrecommend.web.util;
import java.lang.reflect.Method;
import javassist.util.proxy.MethodFilter;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
public class JavassistLearn{
public static void main(String[] args) throws Exception{
ProxyFactory factory=new ProxyFactory();
//设置父类,ProxyFactory将会动态生成一个类,继承该父类
factory.setSuperclass(JavassistClass.class);
//设置过滤器,判断哪些方法调用需要被拦截
factory.setFilter(new MethodFilter() {
@Override
public boolean isHandled(Method m) {
if(m.getName().equals("getName")){
return true;
}
return false;
}
});
//设置拦截处理
factory.setHandler(new MethodHandler() {
@Override
public Object invoke(Object self, Method thisMethod, Method proceed,
Object[] args) throws Throwable {
//拦截后前置处理,改写name属性的内容
//实际情况可根据需求修改
JavassistClass o=(JavassistClass) self;
o.setName("haha");
return proceed.invoke(self, args);
}
});
Class<?> c=factory.createClass();
JavassistClass object=(JavassistClass) c.newInstance();
System.out.println(object.getName());
}
}
分享到:
相关推荐
### Javassist学习手册知识点详解 #### 一、引言 Javassist 是一款功能强大的 Java 字节码操作工具库,它可以动态地修改类结构、方法体等,从而实现类的增强、代理等功能。这对于框架开发、AOP、动态代理等领域...
Javassist 官方手册中文版 Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。...通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。
导入IDEA后,可以进一步学习和实践如何结合这两个工具进行字节码操作和动态增强。 总的来说,javaagent和javassist的结合使用为Java开发者提供了强大的代码操作能力,允许我们在运行时对应用程序进行灵活的扩展和...
它能帮助开发者理解类的结构、方法和字段,对于调试和学习第三方库的内部工作原理非常有用。 `jd-gui` 的主要特性包括: 1. **实时查看**:打开 `.class` 文件后,可以在界面中实时浏览反编译出的源代码。 2. **...
2. **学习API**:熟悉Javassist提供的各种类和方法,如`ClassPool`、` CtClass`、`CtMethod`等,这些都是操作字节码的核心类。 3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来...
- Javassist的官方文档是学习的最佳资源,它详细介绍了API的使用方法和示例。 - 在实践中,你可以从简单的类和方法修改开始,逐渐尝试更复杂的功能。 总结来说,Javassist是一个强大的工具,它简化了Java字节码...
Javaassist是一个开源库,主要用在Java应用程序中动态修改类和类库。...通过阅读源码,开发者不仅可以学习到字节码工程的技巧,还能了解到如何将这些技术应用于实际项目中,提高代码的灵活性和效率。
"javassistDemo"很可能是某个开发者为了展示或者学习Javaassist功能而创建的一个示例项目。 在Javaassist中,主要涉及以下几个关键知识点: 1. **类转换**:Javaassist提供了一个名为`ClassPool`的类,它是整个...
6. **学习与使用**: - **文档**:官方提供详细的API文档和教程,帮助开发者快速上手。 - **示例代码**:通过阅读和实践示例代码,可以更好地理解Javaassist的工作原理和使用方式。 - **社区支持**:Javaassist有...
通过读取这个文件,开发者可以学习到如何在运行时改变类的行为,例如添加新的方法、修改现有方法的字节码或者插入切面逻辑。 5. **需要jdk1.6.txt**: 这表明 Javaassist 版本 3.18.0-GA 至少需要兼容 JDK 1.6,...
8. **学习曲线**:虽然Javaassist提供了丰富的功能,但学习起来并不复杂。它的API设计相对直观,通过阅读文档和实例,开发者可以快速上手。 9. **社区支持**:作为一个成熟的开源项目,Javaassist拥有活跃的开发者...
Javaassist是一个开源库,主要用来在运行时对Java字节码进行操作和分析。...通过深入研究其源码,开发者不仅可以提升自己的字节码操作技能,还可以学习到更多关于Java类加载、反射以及字节码生成的底层知识。
Javaassist 是一个强大的Java字节码操作...通过学习和使用Javaassist,开发者可以更好地掌握Java的底层机制,实现更灵活的代码设计。在实际项目中,合理运用Javaassist可以提高代码的复用性和可维护性,降低维护成本。
5. **学习与使用**: 使用Javaassist需要一定的字节码和反射知识。初学者可以从官方文档、教程和示例代码开始,逐步熟悉其API和使用方式。理解如何创建、修改和加载类是关键,同时注意版本间的兼容性和性能差异。 ...
8. **学习资源**:为了更好地理解和使用Javassist,开发者可以参考其官方文档,以及各种在线教程和示例代码。社区支持也相当活跃,许多开发者分享了他们的经验和技巧。 总的来说,Javassist是一个功能强大且灵活的...
Javaassist是一款强大的开源库,主要用于在运行时对Java字节码进行操作和分析。它以其易用性和灵活性而受到开发者的欢迎,相比其他如...通过深入学习和实践,开发者可以充分利用其功能,提升代码的灵活性和可扩展性。
Java字节码编辑是Java开发中的一个高级主题,它允许开发者在运行时修改或增强类的行为。`javassist`库正是这样一个工具,它为Java...学习并熟练掌握`javassist`,将极大地提升你在Java动态编程和字节码操作方面的技能。
Java字节码工程工具包,通常被称为Javassist,是一个强大的开源项目,它为Java开发者提供了在运行时操作和分析类以及字节码的...通过学习和掌握Javassist,开发者可以更好地应对各种复杂问题,提高代码质量和可维护性。
在学习这部分内容时,读者可能需要创建一个名为`fruity88`的项目,并使用`javassist-3.9.0.jar`来实现某些动态类生成或字节码操作的功能。 总的来说,这个压缩包包含的资源是学习《Thinking in Java》第四版中关于...