`

javassist【动态改字节码】学习二

    博客分类:
  • j2se
 
阅读更多


写了个例子。

有一个类:
Java代码

package seeeyou.app.test;

public class HelloWorld {

public static void sayHello(String hh) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hello world");
}

}



要知道这个方法执行了多久,一般可以直接在sayHello这个方法的前面加
Java代码

    long start = System.currentTimeMillis();

long start = System.currentTimeMillis();

Java代码

    后面加 long end= System.currentTimeMillis()  最后输出下end-start即可

后面加 long end= System.currentTimeMillis()  最后输出下end-start即可



javassist不只是这些功能,还有其他功能。后面再介绍点。

另外一种用javassist的方式也很简单,而且不用在这时改变源代码。

例子如下:
Java代码

package seeeyou.app.test;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;

/**
* 这个例子里用javassist在加载类的时候,给HelloWorld这个类的sayHello方法动态的加入统计方法时间的代码
*
* @author seeeyou
*
*/
public class TestHelloWorld {
public static void main(String[] args) throws NotFoundException,
InstantiationException, IllegalAccessException,
CannotCompileException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
CtClass ctClass = ClassPool.getDefault().getCtClass("seeeyou.app.test.HelloWorld");
// 需要修改的方法名称
String mname = "sayHello";
// 新定义一个方法叫做sayHello$impl
String newMethodName = mname + "$impl";
// 获取这个方法
CtMethod cm = ctClass.getDeclaredMethod(mname);
cm.setName(newMethodName);// 原来的方法改个名字

//创建新的方法,复制原来的方法
CtMethod newMethod = CtNewMethod.copy(cm, mname, ctClass, null);

StringBuilder bodyStr = new StringBuilder();
bodyStr.append("{\nlong start = System.currentTimeMillis();\n");
// 调用原有代码,类似于method();($$)表示所有的参数
bodyStr.append(newMethodName + "($$);\n");

bodyStr.append("System.out.println(\"Call to method " + mname
+ " took \" +\n (System.currentTimeMillis()-start) + "
+ "\" ms.\");\n");

bodyStr.append("}");
// 替换新方法
newMethod.setBody(bodyStr.toString());
// 增加新方法
ctClass.addMethod(newMethod);

// 类已经更改,注意不能使用HelloWorld a=new
// HelloWorld();,因为在同一个classloader中,不允许装载同一个类两次

HelloWorld helloWorld = (HelloWorld) ctClass.toClass().newInstance();
helloWorld.sayHello("add");
}
}



运行结果如下:
Java代码

    hello world
    Call to method sayHello took 3000 ms.

hello world
Call to method sayHello took 3000 ms.



上面这个例子,是可以直接运行的。

javassist不只是这些功能,还有一些其他很好的功能,后面有空再记录下。
分享到:
评论

相关推荐

    Javassist 修改class字节码

    Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...

    借助jclasslib与javassist修改java class字节码

    `javassist`是一个强大的字节码编辑器和类文件操作库,它能够帮助开发者动态地创建或修改类定义。通过`javassist`,可以方便地添加方法、字段或修改现有方法的行为,而无需接触原始源代码。 ##### 2. jclasslib `...

    javassist,Java字节码工程工具包.zip

    Javassist允许程序员在运行时动态修改类或创建新的类,而无需了解复杂的Java字节码指令集。通过提供一种类似于Java语法的API,它降低了字节码级别的编程难度,使得开发者能够更加直观地理解和构建字节码序列。 以下...

    javassist, Java字节码工程工具包.zip

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

    修改字节码 jclasslib

    尽管jclasslib主要用于查看和分析字节码,但通过与其他工具(如ASM、BCEL或Javassist)结合,可以实现字节码的修改。例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,...

    javassist试图简化Java字节码的编辑

    Java字节码编辑是Java开发中的一个高级主题,它允许开发者在运行时修改或增强类的行为。`javassist`库正是这样一个工具,它为Java...学习并熟练掌握`javassist`,将极大地提升你在Java动态编程和字节码操作方面的技能。

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

    2. **使用Javaassist修改字节码**:接下来,我们需要使用Javaassist来获取`MyClass`的`CtClass`对象,并找到被`@MyAnnotation`标记的方法。 ```java import javassist.ClassPool; import javassist.CtClass; import...

    Javassist如何操作Java 字节码

    Javassist是一个强大的Java字节码操作库,它允许开发者在运行时动态修改或创建类。Javassist的出现使得开发者无需深入理解底层字节码指令就能方便地操作类、方法和字段,降低了字节码操作的难度。下面将详细介绍...

    javassist官方手册(中文)

    Javassist 官方手册中文版 Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。...通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...

    javassist:Java字节码工程工具包

    Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。 它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时定义新类,并在JVM加载它时修改类文件。 与其他类似的字节码编辑器不同,Javassist提供了两...

    JAVA字节码操作库 BCEL

    2. **字节码生成**:BCEL提供了一套接口和类,使得开发者可以动态地生成字节码,这对于创建动态代理、AOP(面向切面编程)等场景非常有用。 3. **代码优化**:通过修改字节码,BCEL可以实现代码的优化,例如去除...

    jboss-javassist和JByteMode整合包

    总之,jbosss-javassist结合了Javassist和JByteMode的优势,为开发者提供了一套完整的动态字节码操作解决方案。通过熟练掌握这两个工具,开发者可以应对各种复杂的代码修改和增强需求,提升软件的灵活性和可维护性。...

    java 反编译工具 jboss-javassist

    2. **学习API**:熟悉Javassist提供的各种类和方法,如`ClassPool`、` CtClass`、`CtMethod`等,这些都是操作字节码的核心类。 3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来...

    字节码编程和操作系统等知识文档

    字节码编程是Java技术领域中的一个重要组成部分,它涉及到Java类文件的二进制表示形式,即Java字节码。Java虚拟机(JVM)在运行Java程序时,实际上是在解释和执行这种字节码。字节码编程允许开发者在类加载到JVM之前...

    基于 javaagent 对 java 原生类的 方法进行字节码动态修改, 以此引发的一些关于 绕过 Java 软件.zip

    在实际操作中,我们可能会使用如 ASM、ByteBuddy 或 Javassist 这样的字节码库来帮助创建和应用 ClassFileTransformer。这些库提供了友好的 API,让我们能够方便地读取、修改和生成字节码。 然而,这种方法并不总是...

    Android字节码插件,编译期间动态修改代码,改造添加全埋点日志采集功能模块

    字节码插件,如ASM、Javassist或ByteBuddy,是在Java字节码层面操作,可以修改或增强类的功能。例如,我们可以在编译时自动插入代码,以实现埋点逻辑。 全埋点日志采集是通过跟踪用户在应用中的所有操作,记录下每...

    javaagent+javassist

    Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...

    javassist+jd-gui

    2. **字节码生成**:允许开发者使用类似 Java 的语法生成新的类或者方法的字节码,无需关注底层的字节码表示。 3. **字节码修改**:可以插入、删除或替换已有的字节码指令,实现代码的动态增强。 4. **类转换**:`...

Global site tag (gtag.js) - Google Analytics