`
mtnt2008
  • 浏览: 369370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

javassist简介

阅读更多

javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截等。
javassist的最外层的API和JAVA的反射包中的API颇为类似。它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,,CtMethod,,以及CtField几个类组成。
这是网上的一个例子。它修改了Hello类里say方法。

public class Hello {
 public void say() {
  System.out.println("hello");
 }
}

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class Test {
    public static void main(String args[]) throws Exception {

        ClassPool cp = ClassPool.getDefault();

        CtClass cc = cp.get("test.javassist.Hello");

        CtMethod m = cc.getDeclaredMethod("say");

        m.setBody("{System.out.println(\"shit\");}");

        m.insertBefore("System.out.println(\"fuck\");");

        m.insertAfter("System.out.println(\"method over\");");

        Class c = cc.toClass();

        Hello h = (Hello) c.newInstance();

        h.say();
    }
}

运行结果:
fuck
shit
method over
从结果我们可以看出,hello类里的say()方法已经被修改。

现在我们在来分析各个类的作用

ClassPool 类跟踪和控制所操作的类,它读取.class文件。这个类的工作方式与 JVM 类装载器非常相似,但是有一个重要的区别是它不是将装载的、要执行的类作为应用程序的一部分链接,类池使所装载的类可以通过 Javassist API 作为数据使用,
CtClass 装载到类池中的类,与标准的 Java java.lang.Class 类一样, CtClass 提供了检查类数据(如字段和方法)的方法。不过,这只是 CtClass 的部分内容,它还定义了在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。奇怪的是,Javassist 没有提供删除一个类中字段、方法或者构造函数的任何方法
字段、方法和构造函数分别由 javassist.CtField、 javassist.CtMethod 和 javassist.CtConstructor 的实例表示。这些类定义了修改由它们所表示的对象的所有方法的方法,包括方法或者构造函数中的实际字节码内容

分享到:
评论

相关推荐

    jboss-javassist和JByteMode整合包

    **Javassist简介** Javassist,全称为Java Assistant,是一个开源的Java字节码操作库,它允许开发者在运行时创建和修改类。通过Javassist,我们可以方便地生成和修改类的字节码,从而实现AOP(面向切面编程)等高级...

    javassist-example

    4. **README** 文件:可能包含项目简介、如何运行示例以及解释每个示例的目的。 5. **LICENSE** 文件:项目许可协议,规定了可以如何使用这些示例代码。 在深入学习这个项目之前,你需要了解 Javaassist 的基本...

    Java 动态代理.md

    #### 代理模式简介 代理模式是 23 种设计模式之一,属于结构型设计模式。其核心思想是提供一个代理来控制对某个对象的访问,以便于在不修改原始对象的前提下为其增加新的功能或操作。通过这种方式,可以在目标对象...

    (源码)基于Spring Boot和Netty的分布式日志收集与分析系统.zip

    ## 项目简介 DataXplorer 是一个基于Spring Boot和Netty框架的分布式日志收集与分析系统。该系统旨在解决分布式系统中日志收集和分析的挑战,提供一种高度可定制且不侵入应用代码的方式来实现对日志数据的采集和...

    Struts2简介与入门

    而Struts2框架中,各个jar包的作用也是学习过程中的重点内容,比如struts2-core.jar是Struts2的核心类库,xwork-core.jar是WebWork的核心库,ognl.jar用于支持OGNL表达式语言,而javassist.jar用于操作Java字节码。...

    bytecode-basics:“JVM 字节码简介”会话的源代码

    1. **字节码生成**:展示如何使用Java反射API或其他工具生成自定义字节码,例如使用ASM、BCEL或Javassist库。 2. **字节码分析**:包含用于查看和理解字节码的工具,如javap命令,它能反汇编.class文件,展示方法的...

    Struts2最少jar包

    #### 一、Struts2框架简介 Struts2是基于MVC(Model-View-Controller)设计模式的一种Java Web应用开发框架,它简化了Web应用程序的开发过程,提高了代码的可维护性和扩展性。在实际项目中,开发者往往需要了解并...

    hibernate开发所依赖的jar包

    6. **反射和序列化支持**:`asm-3.3.1.jar`, `cglib-nodep-2.2.2.jar`, `dom4j-1.6.1.jar`, 和 `javassist-3.12.1.GA.jar` - 这些库用于动态代理、XML解析和对象的序列化,它们是Hibernate实现元对象工厂和动态代理...

    JPA 基本jar 文件 附带mysql-`jar文件和persistence.xml配置文件

    **Java持久化API (JPA) 简介** Java持久化API(Java Persistence API)是Java平台上的一个标准,用于管理和操作关系数据库中的数据。它简化了对象关系映射(ORM),允许开发者以面向对象的方式处理数据,而无需直接...

    zdl-utils:平时使用的工具类代码

    模块简介 模块 说明 阿兹卡班 Azkaban ajax Api Java封装 常见的 说明详见每个类文件 弹性搜索 es搜索API封装 加密 加密算法集合 javassist javassist的基本使用 水壶 水壶java api的基本使用 Kubernetes K8S Java...

    SSH整合实例

    SSH框架简介 - **Spring**:轻量级的Java EE开发框架,主要提供依赖注入、面向切面编程等功能。 - **Struts2**:基于MVC设计模式的Web应用程序框架,提供了一套灵活的方式来构建可扩展的应用程序。 - **Hibernate**...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_1_入门介绍 共29页.pptx

    ##### 1.2 MVC设计模式简介 - **定义**:MVC即Model-View-Controller,是一种软件架构模式,用来将应用程序分为三个主要部分:模型、视图和控制器。 - **模型(Model)**:负责管理应用程序的数据,以及定义业务规则...

    hibernate5所需jar包

    6. **javassist**: 提供了运行时字节码操作,用于动态生成类和接口,这是Hibernate的动态代理机制的一部分。 7. ** cglib**: 另一个字节码处理库,用于创建代理类,当Java代理不适用时,Hibernate会使用这个库。 8...

    hibernate-jpa学习

    1. **JPA简介**:JPA是Java平台上的一个标准,它定义了如何在Java应用程序中管理对象到关系数据库映射。通过使用JPA,开发者可以避免直接编写SQL语句,而是通过面向对象的方式来处理数据。 2. **Hibernate与JPA的...

    hibernate jar包

    **Hibernate框架简介** Hibernate是一个强大的开源ORM框架,它允许开发者将Java类与关系型数据库中的表进行映射,从而简化了数据访问层的代码编写。通过使用Hibernate,开发人员可以避免直接编写SQL语句,而是使用...

    Hibernate所用jar包

    一、Hibernate ORM框架简介 Hibernate是Java领域内广泛使用的ORM框架,它允许开发者通过Java对象来操作数据库,而不是直接编写SQL语句。这极大地提高了代码的可读性和可维护性,同时也降低了数据库的耦合度。...

    解决OutOfMemoryError: PermGen space

    2. **动态代理**:使用诸如CGLIB或Javassist等动态代理框架时,会产生大量的临时类,这些类会占用PermGen space。 3. **字符串常量池过大**:如果应用程序频繁地创建和使用字符串,特别是使用`String.intern()`方法...

Global site tag (gtag.js) - Google Analytics