Javassist-ConstPool常量池

什么是常量池

引用关于JVM 7规范的第4.4节

Java virtual machine instructions do not rely on the runtime layout of classes, interfaces, class instances, or arrays. Instead, instructions refer to symbolic information in the constant_pool table

大致意思:Java虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用 constant_pool 表中的符号信息。

所以,当我们创建属性相关实例时,都需要参数 constant_pool

如何获取常量池

方式一:通过ClassFile

ClassPool pool = ClassPool.getDefault();
 //获取实体类
CtClass ctClass = pool.get(obj.getClass().getName());
ConstPool constPool = ctClass.getClassFile().getConstPool();

方式二:通过FieldInfo

ClassPool pool = ClassPool.getDefault();
//获取实体类
CtClass ctClass = pool.get(obj.getClass().getName());
//获取属性
CtField ctField = ctClass.getField(FieldName);
//获取属性字段信息
FieldInfo fieldInfo = ctField.getFieldInfo();
//获取常量池
ConstPool constPool = fieldInfo.getConstPool();

方式三:通过MethodInfo

ClassPool pool = ClassPool.getDefault();
//获取实体类
CtClass ctClass = pool.get(obj.getClass().getName());
//获取方法
CtMethod ctMethod = ctClass.getDeclaredMethod("foo","ceshi");
//获取方法信息
MethodInfo methodInfo = ctMethod.getMethodInfo();
//获取常量池
ConstPool constPool = methodInfo.getConstPool();

测试:

System.out.println("ConstPool=" + ctClass.getClassFile().getConstPool());
System.out.println("ConstPool=" + ctClass.getField(FieldName).getFieldInfo().getConstPool());
System.out.println("ConstPool=" + ctClass.getDeclaredMethod("foo").getMethodInfo().getConstPool());

if (fieldInfo.getConstPool().equals(ctClass.getClassFile().getConstPool())) {
    System.out.println("true");
}

输出:

ConstPool=javassist.bytecode.ConstPool@7a07c5b4
ConstPool=javassist.bytecode.ConstPool@7a07c5b4
ConstPool=javassist.bytecode.ConstPool@7a07c5b4
true

测试发现,三种方式获取的 ConstPool 是一样的。每个Java类都有一个常量池,使用常量池需要注意:

  • 在Javassist中,CtClass中的常量池字段是一个实例字段,这意味着如果您有两个 CtClass 对象代表同一个类,您将有两个不同的常量池实例(即使它们代表实际类文件中的常量池)。修改 CtClass 实例之一时,必须使用相关联的常量池实例,以具有预期的行为。
  • 有时您可能没有 CtClass 而是 CtMethod 或 CtField,这不允许您回溯到CtClass实例,在这种情况下,可以使用ctMethod.getMethodInfo().getConstPool()ctField.getFieldInfo().getConstPool() 获取常量池。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值