super class 不可分配给 class 在运行时由 asm 实现

super class not assignable to class implemented during runtime by asm

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

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 并调用 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'

我猜 class Y 在运行时还不可用吗?我不知道.. 任何帮助将不胜感激!

编辑: 我加载XImpl的方式很简单:

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

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

似乎 ASM 类加载器不是 X 类加载器的子类加载器,因此有两个不同的 类(即使它们相同),它们不能相互转换。

尝试使用:

Method m = ClassLoader.getDeclaredMethods("defineClass", String.class, byte[].class, int.class, int.class);
m.setAccessible(true);
m.invoke(X.class.getClassLoader(), ...);