• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

java中javassist、ClassPool、CtClass、Apache CC2链学习

https://blog.csdn.net/qq_41874930/article/details/121273650

 https://www.cnblogs.com/cqqfboy/p/14785380.html

可以用字符串写一个类,并加入到程序中,也可以操作这个类的代码。

 

1. 什么是javassist

javassist是一个处理Java字节码的jar包,里面有很多类。

2. 什么是ClassPool

可以想象成一个容器,里面放着指定路径下的class文件,使用javassist对类进行操作的时候,必须先创建一个ClassPool。

它也可以暂时存放我们编辑的class文件,等写完后再拿出来放到指定的位置。我们对class文件的操作是在ClassPool中的进行的。

假如我们想获取一个Class文件进行修改,如果ClassPool的路径中没有它,那么我们是找不到的,必须使用insertClassPath();函数将class文件路径导入ClassPool中才可以。

如果我们不自定义路径,那么它的类的搜索路径包括平台库、扩展库以及由-classpath选项或CLASSPATH环境变量指定的搜索路径。

3. 什么是CtClass

CtClass是javassist中的一个类文件,它的对象可以理解成一个class文件的抽象表示。

一个CtClass对象可以用来修改一个class文件。

 

4. 写一个Class文件test.class

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

import java.io.FileOutputStream;

public class JavasistTest {

    public static void main(String[] args) throws Exception{
        //默认的类搜索路径
        ClassPool pool = ClassPool.getDefault();

        //获取一个ctClass对象
        CtClass ctClass = pool.makeClass("Test");
        try {
            //添加age属性
            ctClass.addField(CtField.make("private int age;", ctClass));
            //添加setAge方法
            ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}", ctClass));
            //添加getAge方法
            ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass));
            //将ctClass生成字节数组,并写入文件
            byte[] byteArray = ctClass.toBytecode();
            FileOutputStream output = new FileOutputStream("/Users/zhujiayu/IdeaProjects/untitled/out/production/untitled/Test.class");
            output.write(byteArray);
            output.close();
            System.out.println("文件写入成功!!!");
        } catch (Exception e) {
            e.printStackTrace();
        }
}
}
View Code

 

posted on 2022-11-08 15:11  无信不立  阅读(103)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3