运行 datanucleus 增强器后,我得到了一个奇怪的行为。然后尝试生成 EntityManagerFactory,我在 java.lang.VerifyError 中运行,这是
method: setItem signature: (Ljava/lang/Object;)V) Incompatible argument to function" type="java.lang.VerifyError">java.lang.VerifyError: (class: de/suur/wr/generated/FlagType$FlagTypeRemoveFlagsItem, method: setItem signature: (Ljava/lang/Object;)V) Incompatible argument to function
该方法的原始声明是:
public void setItem(String value) {
this.item = value;
}
我发现java向字节码添加了一些合成桥接方法,这确实与错误匹配(见下文)。但通常这种方法可以和平共处。也许该错误根本与增强器无关,但是我没有其他直觉认为它是相关的。可能是什么原因?
// Method descriptor #53 (Ljava/lang/Object;)V
// Stack: 2, Locals: 2
public bridge synthetic void setItem(java.lang.Object arg0);
0 aload_0 [this]
1 aload_1 [arg0]
2 checkcast java.lang.String [54]
5 invokevirtual de.suur.wr.generated.FlagType$FlagTypeRemoveFlagsItem.setItem(java.lang.String) : void [56]
8 return
Line numbers:
[pc: 0, line: 1]
和原始方法:
// Method descriptor #36 (Ljava/lang/String;)V
// Stack: 2, Locals: 2
public void setItem(java.lang.String value);
0 aload_0 [this]
1 aload_1 [value]
2 putfield de.suur.wr.generated.FlagType$FlagTypeRemoveFlagsItem.item : java.lang.String [33]
5 return
Line numbers:
[pc: 0, line: 314]
[pc: 5, line: 315]
Local variable table:
[pc: 0, pc: 6] local: this index: 0 type: de.suur.wr.generated.FlagType.FlagTypeRemoveFlagsItem
[pc: 0, pc: 6] local: value index: 1 type: java.lang.String
我在 servile 组合中使用了 datanucleus(DN) 和 datanucleus maven 插件(DNM2): (DN,DNM2) 1.1.4 , 2.0.0 和 2.1.1, 2.1.1 。堆栈跟踪是
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.datanucleus.metadata.annotations.AbstractAnnotationReader.getJavaBeanAccessorAnnotationsForClass(AbstractAnnotationReader.java:238)