运行DataNucleus Enhancer后的java.lang.VerifyError

时间:2010-11-10 16:39:57

标签: java datanucleus

运行datanucleus enhancer后,我有一个奇怪的行为。然后尝试生成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

我在服务组合中使用了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)

1 个答案:

答案 0 :(得分:0)

显然,如果使用DN v1.1,那么您应该使用DN M2插件v1.1(使用增强器v1.1)。毋庸置疑,我们只“支持”当前版本,而且这两个版本都不属于该类别