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(), ...);