`

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代码层,...

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

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

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

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

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

    Java字节码工程工具包

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

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

    Javassist如何操作Java 字节码

    主要介绍了Javassist如何操作Java 字节码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

    javassist:Java字节码工程工具包

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

    javassist-3.14.0-GA

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    Javassistjar包

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javassist官方手册(中文)

    javassist是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到jvm。文档内容全面。

    javassist反射工具

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    免费开源!!Java字节码工程工具包

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

    javassist.zip

    Javassist(JAVA编程助手)进行JAVA字节码操作 易于理解的它是一个用于在Java中编辑字节码的类库;它支持Java 程序在运行时定义一个新类,并在 JVM加载它。与其他类似的字节码编辑器不同,Javassist提供了 API的...

    Javassist-3.12

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法...

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

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

    javassist API chm格式

    javassist API chm格式 字节码生成类库

    javassist-3.18.0-ga.jar

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru ...它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

    javassist-3.12.1.GA.jar

    开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

    DroidAssist,一个基于javassist的轻量级android studio gradle插件,用于在android中编辑字节码。.zip

    机器人助手提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的...

Global site tag (gtag.js) - Google Analytics