我们可以使用javassist将非原始字段添加到现有类吗?

Lif*_*des 7 java javassist

我是Javassist的新手,我已经阅读了一些与之相关的教程.

因为我需要在方法退出之前或之前对每个方法执行一些字节码注入,并从中获取一些统计信息.

通过在线javassit教程,我发现我们可以为现有类创建一个新字段:

CtClass point = ClassPool.getDefault().get("Point");
CtField f = new CtField(CtClass.intType, "z", point);
point.addField(f);
Run Code Online (Sandbox Code Playgroud)

但是CtField的类型默认只包含基本类型,我们可以添加一个非原始类型的新字段,例如ArrayList吗?

如果我可以将新的ArrayList字段添加到现有类,因为该类不导入java.util.ArrayList,是否会导致编译错误?

Per*_*ion 8

是的,您可以添加非原始字段.你只需要获得该字段的类的句柄,通常通过ClassPool.请注意,您将需要要使用的类的完全限定名称:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList");
CtClass point = ClassPool.getDefault().get("Point");
CtField f = new CtField(arrListClazz, "someList", point);
point.addField(f);
Run Code Online (Sandbox Code Playgroud)

  • @Perception我正在尝试你共享的代码片段,但是如何读取新添加的字段的值?我尝试了反射代码,但它无法正常工作.您对如何阅读动态加法字段的值有任何想法吗? (3认同)