1
查看版本号:
F:\bisoft\ext\javassist-3.11.GA\javassist-3.11.0>java -jar javassist.jar
Javassist version 3.11.0.GA
Copyright (C) 1999-2009 Shigeru Chiba. All Rights Reserved.
F:\bisoft\ext\javassist-3.11.GA\javassist-3.11.0>
2
Dump CLASS
package cn.bisoft.java.util.test;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.PrintWriter;
import javassist.bytecode.ClassFile;
import javassist.bytecode.ClassFileWriter;
public class ClassDumpUtil
{
public static void dump(String classFilePath) throws Exception
{
DataInputStream in = new DataInputStream(new FileInputStream(classFilePath));
ClassFile w = new ClassFile(in);
PrintWriter out = new PrintWriter(System.out, true);
out.println("*** constant pool ***");
w.getConstPool().print(out);
out.println();
out.println("*** members ***");
ClassFileWriter.print(w, out);
}
public static void main(String[] args) throws Exception {
ClassDumpUtil.dump("E:/bisoft/code/workspace/bisoft/build/classes/cn/bisoft/java/core/F.class");
}
}
3
javassist.jar 依赖 JDK/LIB/tools.jar
导入示例:
src -/
example +
4
示例1:
Test.java
增加一个不存在的方法到类g()中.
package sample;
import javassist.*;
public class Test
{
public int f(int i)
{
return i + 1;
}
public static void main(String[] args) throws Exception
{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("sample.Test");
try
{
cc.getDeclaredMethod("g");
System.out.println("g() is already defined in sample.Test.");
}
catch (NotFoundException e)
{
/*
* getDeclaredMethod() throws an exception if g() is not defined in sample.Test.
*/
CtMethod fMethod = cc.getDeclaredMethod("f");
CtMethod gMethod = CtNewMethod.copy(fMethod, "g", cc, null);
cc.addMethod(gMethod);
cc.writeFile(); // update the class file
System.out.println("g() was added.");
}
}
}
运行后:
g() was added.
验证结果:
a. class 的修改时间已经修改
b. 反编译 class 文件 ,查看源码已经修改
package sample;
import java.io.PrintStream;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class Test
{
public int f(int i)
{
return (i + 1);
}
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("sample.Test");
try {
cc.getDeclaredMethod("g");
System.out.println("g() is already defined in sample.Test.");
}
catch (NotFoundException e)
{
CtMethod fMethod = cc.getDeclaredMethod("f");
CtMethod gMethod = CtNewMethod.copy(fMethod, "g", cc, null);
cc.addMethod(gMethod);
cc.writeFile();
System.out.println("g() was added.");
}
}
[b] public int g(int i)
{
return (i + 1);
}
[/b]
}
5
例子2
分享到:
相关推荐
1. **动态类生成**:你可以使用Javaassist快速生成新的类,而无需编写源代码文件。这在构建动态代理或者需要在运行时创建新类型的应用中非常有用。 2. **类修改**:它允许在运行时对现有类进行修改,如添加方法、...
要深入了解 Java Instrumentation 和 Javaassist,可以查阅官方文档,以及相关的教程和示例代码,如 "Java 动态代理"、"Javaassist 使用指南" 等。 通过理解和应用这些概念,开发者可以构建强大的 RASP 解决方案,...
这段代码展示了如何使用JavaAssist动态创建一个名为`NewClass`的类,并添加一个`String`类型的字段`name`和一个`sayHello`方法。 总之,JavaAssist是Java开发中的一个重要工具,它简化了字节码级别的编程,使得...
3. 类加载器:在运行时,Javaassist使用自定义的类加载器 (`ClassPool` 中的 `makeClass` 方法) 将修改后的字节码转换为实际的Java类并加载到JVM中。 4. 代码生成:Javaassist提供了类似于Java语法的API,可以方便...
例如,你可以使用Javaassist在已有类中添加新方法,修改现有方法,或者完全从头构建新的类。 要使用Javaassist,首先需要在项目中引入对应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml ...
`javassist-3.7.ga.jar`是Javaassist的一个版本,ga代表“General Availability”,意味着这是一个稳定版本,适合在生产环境中使用。 Javaassist的核心功能包括: 1. **字节码操作**:Javaassist提供了一种简单的...
Javaassist与Hibernate框架的结合使用,是因为Hibernate是一个基于JPA(Java Persistence API)的ORM(对象关系映射)框架,用于简化数据库操作。在Hibernate中,Javaassist用于动态生成和修改Java类的字节码,以...
以下是对Javaassist关键特性和使用的详细解释: 1. **类的动态修改**: Javaassist允许开发者在程序运行过程中动态修改类的结构。你可以添加、删除或修改方法和字段,甚至可以改变类的继承关系。这对于实现AOP...
2. **生成字节码**:使用 Javaassist 分析目标类的字节码,并在相应的调用前后插入埋点代码,记录调用开始和结束的时间、参数、返回值等信息。 3. **注入 Agent**:将包含埋点逻辑的 Agent 附加到目标应用程序,确保...
Javaassist 是一个强大的开源库,主要用于在运行时...通过理解和熟练使用Javaassist,开发者可以更灵活地控制程序行为,实现复杂的设计和优化。在实际项目中,掌握Javaassist的用法可以极大地提高开发效率和代码质量。
在描述中提到的net.mindview.atunit框架,是一个轻量级的测试框架,它使用了Javaassist来简化单元测试的编写。 Javaassist的核心功能包括: 1. **字节码操作**:Javaassist提供了一套API,使得程序员可以创建新的...
例如,你可以使用Javaassist来实现一个类增强器,为现有类添加新的行为,而无需重新编译源代码。 在"javassist-3.9.0"这个压缩包中,包含的是Javaassist的3.9.0稳定版本的库文件。这个版本可能修复了之前版本的一些...
Javaassist 是一个强大的开源库,主要用于在运行时动态修改 Java 类和字节码。这个名为 "jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a...如果你需要在项目中实现类似的功能,掌握 Javaassist 的使用是十分必要的。
6. **兼容性与性能**:Javaassist支持Java SE 5.0及以上的版本,并且它的性能通常比使用反射API来操作字节码更高效。这是因为Javaassist可以直接处理字节码,而反射则需要在运行时解析类信息。 总的来说,...
`javassist demo`是关于如何使用Javaassist的一个实例展示,通过分析`test_javassist`中的源代码,我们可以深入理解Javaassist的功能和用法。 Javaassist提供了一套API,可以用来创建新的类,修改现有类的方法和...
2. **类转换**:开发者可以使用Javaassist将Java源代码转换为字节码,也可以将字节码转换回源代码。这种能力使得在不重新编译的情况下进行代码调试和分析成为可能。 3. **类加载器**:Javaassist提供了一个自定义类...
本示例"JavaAgent-agentmain方式 demo"着重展示了如何使用JavaAgent的`agentmain`方法以及相关的Javaassist和VirtualMachine技术。 JavaAgent主要通过两个入口点与应用程序交互:`premain`和`agentmain`。`premain`...
Javaassist是一个强大的开源库,主要用于在运行时动态地修改Java类。这个库的名字"javassist"是"Java Class ...在实际开发中,熟练掌握Javaassist的使用,可以解决许多复杂的问题,提高代码的可维护性和灵活性。
这个 "javassist-3.15.0-GA.jar" 文件就是一个 JAR 包,包含了 Javaassist 库的所有类和方法,使得开发者可以直接在他们的项目中引用和使用。 Javaassist 提供了一套API,可以方便地对字节码进行操作。这些操作包括...
例如,开发者可以使用Javaassist来插入日志语句,或者在运行时改变类的行为,而无需重新编译源代码。 在javassist-3.23.1-GA.jar中,我们可以找到以下关键组件: 1. ** CtClass **:这是Javaassist的核心类,代表...