代码之家  ›  专栏  ›  技术社区  ›  joecks

运行DataNucleus增强器后出现java.lang.VerifyError

  •  0
  • joecks  · 技术社区  · 14 年前

    我在运行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
    

    我使用datanucleus(DN)和datanucleus maven插件(DN m 2)作为可供使用的组合:(DN,DNM2)1.1.4、2.0.0和2.1.1、2.1.1。stacktrace是

        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 回复  |  直到 14 年前
        1
  •  0
  •   DataNucleus    14 年前

    显然,如果使用DN v1.1,那么您应该使用DN M2插件v1.1(它使用enhancerv1.1)。不用说,我们只“支持”当前版本,而这两个版本都不属于该类别