`

javaassist 的使用

阅读更多
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




0
0
分享到:
评论

相关推荐

    javaassist

    1. **动态类生成**:你可以使用Javaassist快速生成新的类,而无需编写源代码文件。这在构建动态代理或者需要在运行时创建新类型的应用中非常有用。 2. **类修改**:它允许在运行时对现有类进行修改,如添加方法、...

    基于 Java Instrumentation + Javaassist 的简单 RASP.zip

    要深入了解 Java Instrumentation 和 Javaassist,可以查阅官方文档,以及相关的教程和示例代码,如 "Java 动态代理"、"Javaassist 使用指南" 等。 通过理解和应用这些概念,开发者可以构建强大的 RASP 解决方案,...

    JAVAAssist jar包 ,最新发布,4月16号更新

    这段代码展示了如何使用JavaAssist动态创建一个名为`NewClass`的类,并添加一个`String`类型的字段`name`和一个`sayHello`方法。 总之,JavaAssist是Java开发中的一个重要工具,它简化了字节码级别的编程,使得...

    javassist 包

    3. 类加载器:在运行时,Javaassist使用自定义的类加载器 (`ClassPool` 中的 `makeClass` 方法) 将修改后的字节码转换为实际的Java类并加载到JVM中。 4. 代码生成:Javaassist提供了类似于Java语法的API,可以方便...

    一个牛逼的 Java 字节码类库!(csdn)————程序.pdf

    例如,你可以使用Javaassist在已有类中添加新方法,修改现有方法,或者完全从头构建新的类。 要使用Javaassist,首先需要在项目中引入对应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml ...

    javassist.jar源码

    `javassist-3.7.ga.jar`是Javaassist的一个版本,ga代表“General Availability”,意味着这是一个稳定版本,适合在生产环境中使用。 Javaassist的核心功能包括: 1. **字节码操作**:Javaassist提供了一种简单的...

    javassist-3.18.1-GA.jar

    Javaassist与Hibernate框架的结合使用,是因为Hibernate是一个基于JPA(Java Persistence API)的ORM(对象关系映射)框架,用于简化数据库操作。在Hibernate中,Javaassist用于动态生成和修改Java类的字节码,以...

    javassist使用手册

    以下是对Javaassist关键特性和使用的详细解释: 1. **类的动态修改**: Javaassist允许开发者在程序运行过程中动态修改类的结构。你可以添加、删除或修改方法和字段,甚至可以改变类的继承关系。这对于实现AOP...

    第二课:调用链核心技术-Agent采集埋点实现1

    2. **生成字节码**:使用 Javaassist 分析目标类的字节码,并在相应的调用前后插入埋点代码,记录调用开始和结束的时间、参数、返回值等信息。 3. **注入 Agent**:将包含埋点逻辑的 Agent 附加到目标应用程序,确保...

    javassist 3.23.1版本

    Javaassist 是一个强大的开源库,主要用于在运行时...通过理解和熟练使用Javaassist,开发者可以更灵活地控制程序行为,实现复杂的设计和优化。在实际项目中,掌握Javaassist的用法可以极大地提高开发效率和代码质量。

    Javassist.jar

    在描述中提到的net.mindview.atunit框架,是一个轻量级的测试框架,它使用了Javaassist来简化单元测试的编写。 Javaassist的核心功能包括: 1. **字节码操作**:Javaassist提供了一套API,使得程序员可以创建新的...

    javassist3.9GA

    例如,你可以使用Javaassist来实现一个类增强器,为现有类添加新的行为,而无需重新编译源代码。 在"javassist-3.9.0"这个压缩包中,包含的是Javaassist的3.9.0稳定版本的库文件。这个版本可能修复了之前版本的一些...

    jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b

    Javaassist 是一个强大的开源库,主要用于在运行时动态修改 Java 类和字节码。这个名为 "jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a...如果你需要在项目中实现类似的功能,掌握 Javaassist 的使用是十分必要的。

    javassist-rel_3_23_1_ga

    6. **兼容性与性能**:Javaassist支持Java SE 5.0及以上的版本,并且它的性能通常比使用反射API来操作字节码更高效。这是因为Javaassist可以直接处理字节码,而反射则需要在运行时解析类信息。 总的来说,...

    javassist demo

    `javassist demo`是关于如何使用Javaassist的一个实例展示,通过分析`test_javassist`中的源代码,我们可以深入理解Javaassist的功能和用法。 Javaassist提供了一套API,可以用来创建新的类,修改现有类的方法和...

    javassist-3.7.GA.zip

    2. **类转换**:开发者可以使用Javaassist将Java源代码转换为字节码,也可以将字节码转换回源代码。这种能力使得在不重新编译的情况下进行代码调试和分析成为可能。 3. **类加载器**:Javaassist提供了一个自定义类...

    JavaAgent例子-agentmain方式 demo

    本示例"JavaAgent-agentmain方式 demo"着重展示了如何使用JavaAgent的`agentmain`方法以及相关的Javaassist和VirtualMachine技术。 JavaAgent主要通过两个入口点与应用程序交互:`premain`和`agentmain`。`premain`...

    javassist-rel_3_20_0_ga-22-gccddf79

    Javaassist是一个强大的开源库,主要用于在运行时动态地修改Java类。这个库的名字"javassist"是"Java Class ...在实际开发中,熟练掌握Javaassist的使用,可以解决许多复杂的问题,提高代码的可维护性和灵活性。

    javassist3150gajar_jb51

    这个 "javassist-3.15.0-GA.jar" 文件就是一个 JAR 包,包含了 Javaassist 库的所有类和方法,使得开发者可以直接在他们的项目中引用和使用。 Javaassist 提供了一套API,可以方便地对字节码进行操作。这些操作包括...

    javassist-3.23.1-GA.rar

    例如,开发者可以使用Javaassist来插入日志语句,或者在运行时改变类的行为,而无需重新编译源代码。 在javassist-3.23.1-GA.jar中,我们可以找到以下关键组件: 1. ** CtClass **:这是Javaassist的核心类,代表...

Global site tag (gtag.js) - Google Analytics