gpt4 book ai didi

更改字段类型后出现 javassist NoSuchFieldError

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:24 27 4
gpt4 key购买 nike

我目前正在摆弄 javassist 并遇到了这个问题。我正在尝试使用 javassist 更改字段类型。但是,当代码在我更改后尝试访问该字段时,结果是 NoSuchFieldException。

所以这是我要更改的类:

public class AlterMe {
private ClassA someField;
public void doSomething() {
someField.doSomething(Object someArg);
}
}

这是我的类加载器进行实际更改的部分:

//...Left out all the boilerplate code for testing if its the right class
Class ctClass = ClassPool.getDefault().get(name);
ctClass.getField("SomeField").setType(ClassPool.getDefault().get("the.replacement.ClassB");
// I also do the instantiation inside the constructors
for (CtConstructor constructor : ctClass.getConstructors()) {
constructor.insertBefore("someField = new the.replacement.ClassB();");
}

我还尝试了其他几种更改字段类型的方法。例如,我尝试删除该字段并添加一个同名的字段,或者将对 someField 的调用重定向到我在使用正确类型之前添加的 someFieldNew 。因此,当我现在运行 doSomething() 时,我收到此异常:

Exception in thread "main" java.lang.NoSuchFieldError: someField

为了完整起见,我使用源代码级别 1.7 和 javassist 版本 3.21.0-GA。

我希望任何人都可以帮忙解决这个问题,因为我确实被困在这里了。

最佳答案

好的,这是我终于找到的解决方案。这不太好,但是很有效。而不是替换

的类型
someField

我添加了一个具有正确类型的字段,并使用 ExprEditor 来更改所有方法调用。代码如下:

CtField field = new CtField(ClassPool.getDefault().get("the.replacement.classB"), "classB", ctClass);
ctClass.addField(field, CtField.Initializer.byExpr("new the.replacement.classB()"));
for (CtMethod method : ctClass.getMethods()) {
method.instrument(new ExprEditor() {
public void edit(MethodCall methodCall) throws CannotCompileException {
if (methodCall.getMethodName().equals("doSomething") && methodCall.getClassName().getClassName().equals("the.original.ClassA")) {
methodCall.replace("classB.doSomething($1)");
}
}
}

我唯一注意到的是重载该方法不起作用。假设 ClassB 有方法

 doSomething(Object)
doSomething(Sting)
doSomething(int)

它将始终调用 Object 方法。但这是我可以忍受的。

如果有人知道更好的解决方案,我仍然希望看到它。

关于更改字段类型后出现 javassist NoSuchFieldError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49411068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com