2

我有一个由内部接口组成的 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

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

4

1 回答 1

2

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

尝试使用:

Method m = ClassLoader.getDeclaredMethods("defineClass", String.class, byte[].class, int.class, int.class);
m.setAccessible(true);
m.invoke(X.class.getClassLoader(), ...);
于 2015-05-11T19:02:53.557 回答