超级班级不能分配给ASM运行时实现的类



i有一个由内部接口组成的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代码是正确的,但是事实是在定义类和call 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级Y在运行时不可用吗?我不知道..任何帮助将不胜感激!

编辑:我加载ximpl的方式非常简单:

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

我确定我的字节代码和类加载方法是正确的原因

似乎ASM Classloader不是X Classloader的孩子,因此有两个不同的类(即使它们相同),它们不能互相施放。

尝试使用:

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

相关内容

  • 没有找到相关文章

最新更新