【问题标题】:Scala, VerifyError when implementing OSGI service with Java interfaceScala,使用Java接口实现OSGI服务时的VerifyError
【发布时间】:2018-11-05 08:10:07
【问题描述】:

Java 抽象类:

public abstract class ActionProcessorExtensionPoint<A extends Action<?>> extends ExtensionPoint

public abstract class ActionProcessorExtensionBase<A extends Action<?>> extends ActionProcessorExtensionPoint<A> {
    protected final Log log = LogFactory.getLog(getClass());
    private final Set<Class<? extends A>> supportedClasses; 

    public ActionProcessorExtensionBase(Class<? extends A> actionClass) {
        supportedClasses = computeClasses(actionClass);
    }

}

Scala 类:

@Component(immediate = true)
@Provides(specifications = Array(classOf[ActionProcessorExtensionPoint[_ <:Action[T] forSome {type T}]]))
@Instantiate
class ActionPolicyDefinitionCreateProcessorExtension(
  val actionClass: Class[ActionPolicyDefinitionCreate]
) extends ActionProcessorExtensionBase[ActionPolicyDefinitionCreate](actionClass) { 

    def this() {
      this(classOf[ActionPolicyDefinitionCreate])
    }
 }

错误:

[ActionPolicyDefinitionCreateProcessorExtension-0] createInstance -> The POJO constructor invocation failed : Bad type on operand stack



Exception Details:

 Location:

   ActionPolicyDefinitionCreateProcessorExtension.<init>(Lorg/apache/felix/ipojo/InstanceManager;Ljava/lang/Class;)V @2: invokevirtual

 Reason:

   Type uninitializedThis (current frame, stack[0]) is not assignable to 'ActionPolicyDefinitionCreateProcessorExtension'

 Current Frame:

   bci: @2

   flags: { flagThisUninit }

   locals: { uninitializedThis, 'org/apache/felix/ipojo/InstanceManager', 'java/lang/Class' }

   stack: { uninitializedThis, 'java/lang/Class' }

 Bytecode:

   0x0000000: 2a2c b600 f02a 2cb7 00f2 2a2b b700 f6b1

   0x0000010:                                        

java.lang.VerifyError: Bad type on operand stack Exception Details: Location: ActionPolicyDefinitionCreateProcessorExtension.<init>(Lorg/apache/felix/ipojo/InstanceManager;Ljava/lang/Class;)V @2: invokevirtual 

【问题讨论】:

    标签: scala osgi scala-java-interop verifyerror ipojo


    【解决方案1】:

    问题是 ActionPolicyDefinitionCreateProcessorExtension 不应该有带参数的构造函数,因为它是一个 IPOJO 组件。解决方案是将其重写为:

    @Component(immediate = true)
    @Provides(specifications = Array(classOf[ActionProcessorExtensionPoint[_ <:Action[T] forSome {type T}]]))
    @Instantiate
    class ActionPolicyDefinitionCreateProcessorExtension
      extends ActionProcessorExtensionBase[ActionPolicyDefinitionCreate](classOf[ActionPolicyDefinitionCreate]) { ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多