gpt4 book ai didi

java - 使用 ASM : ClassCastException 实现接口(interface)

转载 作者:行者123 更新时间:2023-12-01 18:37:58 26 4
gpt4 key购买 nike

我正在编写一个需要动态实现接口(interface)的应用程序。我在生成类方面没有(明显的)问题:我使用 javap 和反编译器验证了它。

问题是,在生成我定义并实例化的类之后。最后,我将其转换为实现的接口(interface)的类型。

问题是我遇到了 java.lang.ClassCastException: MyGenerateClass 无法转换为 MyInterface,尽管当我添加 MyInterface 作为接口(interface)时调用ClassWriter.visit。

下面是一个 SSCCE,演示了名为 MyInterface 且充满 void 方法的接口(interface)的问题。

ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);

cw.visit(V1_6,
ACC_PUBLIC | ACC_SUPER,
"MyGeneratedClass",
null,
"java/lang/Object",
new String[]{MyInterface.class.getName().replace(".", "/"});

{
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL,
"java/lang/Object",
"<init>",
"()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}

for (Method call : MyInterface.class.getDeclaredMethods()) {
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, call.getName(), Type.getMethodDescriptor(call), null, null);
// ...
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
cw.visitEnd();
byte[] raw = cw.toByteArray();

try {
return (MyInterface) new ClassLoader() {
public Class defineClass(byte[] bytes) {
return super.defineClass("MyGeneratedClass", bytes, 0, bytes.length);
}
}.defineClass(raw).newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}

打印出generateObject.getClass().getInterfaces()确实表明MyInterface已实现。但是 generatedObject instanceof MyInterface 返回 false,我发现这是矛盾的。

有人能解释一下这里发生的事情吗?任何帮助将不胜感激。

最佳答案

我猜这是因为新的类加载器不是加载 MyInterface 的类加载器的子加载器,这意味着您最终会得到两个不同的类,尽管它们是不同的外观相同。尝试改变

return (MyInterface) new ClassLoader() {

return (MyInterface) new ClassLoader(MyInterface.class.getClassLoader()) {

关于java - 使用 ASM : ClassCastException 实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com