超类不能分配给在运行时由asm实现的类

时间:2015-05-11 17:59:19

标签: java runtime java-bytecode-asm dynamic-class-creation

我有一个由内部接口组成的java类,并计划在运行时使用asm字节码注入实现实现类。

package my.example;
public class X{
    public static interface XInt{
        public void getX();
    }
    //the following class that implement the interface will be defined during runtime.
    //I put it here just to show how the implementation will look like
    public static XImpl extend Y implements XInt{
        public void getX(){//implementation code}
    }
}

我确定我的asm代码是正确的,但事情是在定义类并调用Class.forName(" my.example.X $ XImpl")后,我收到以下错误:

> Bad <init> method call
Exception Details:
  Location:
    my/example/X$XImpl.<init>()V: invokespecial
  Reason:
    Type 'my/other/package/Y' is not assignable to 'my/example/X$XImpl'

我的猜测是Y类在运行时尚不可用?我不知道..任何帮助将不胜感激!

修改: 我加载XImpl的方式非常简单:

defineClass("my.example.X$XImpl", getXImplByte());
Class.forName("my.example.X$XImpl"); //fails here

我确定我的字节码和类加载方法是正确的,因为如果我定义实现类而不扩展任何其他类,它将正常工作

1 个答案:

答案 0 :(得分:2)

似乎ASM类加载器不是var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA", "prov": "cryptojs/jsrsa"}); var key = KEYUTIL.getKey(privateKey, 'password'); sig.initSign(key); sig.updateString(data); var signature = sig.sign(); 类加载器的子类,因此有两个不同的类(即使它们是相同的),它们不能相互转换。

尝试使用:

X