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