gpt4 book ai didi

java - 检查类(class)是否是类(class)的子类(class)

转载 作者:太空宇宙 更新时间:2023-11-04 14:06:48 28 4
gpt4 key购买 nike

我正在通过 ClassLoader 加载类:

Class<?> clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).replaceAll("/", "."));
System.out.println(clazz);
System.out.println(clazz.isInstance(SkillCast.class));
System.out.println(SkillCast.class.isInstance(clazz));
System.out.println(SkillCast.class.isAssignableFrom(clazz));
System.out.println(clazz.isAssignableFrom(SkillCast.class));

这是我的结构:

public class SkillFireball extends SkillCast implements ISkillThrown
public abstract class SkillCast extends Skill

打印结果是:

class skills.SkillFireball
false
false
false
false

我确信 clazz 是 SkillFireball 并且我可以打印字段/方法名称。

如何检查 clazz 是否是 SkillCast 的子项?

编辑

private static URLClassLoader urlClassLoader;

和代码:

ClassLoader cl = Loader.instance().getModClassLoader();
urlClassLoader = URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]), cl);

#getModClassLoader() 返回的位置:

    // The class loader we load the mods into.
private ModClassLoader modClassLoader;

还有:

public class ModClassLoader extends URLClassLoader

它是如何工作的:Minecraft Forge API 正在加载@Mod。我的 mod 提供 SkillCast.class,加载时尝试读取游戏目录并加载 .jar 文件中的类。现在 - 我不太知道我应该做什么:C

最佳答案

我做到了。

问题实际上是我对 classLoader-parenting 如何工作以及 Java 如何加载类缺乏了解。

通过创建新的 URLClassLoader 并将父级设置为主程序本身使用的 ClassLoader(提到的 @Mod)来完成此操作。

SkillCast.class 是由 Mod 的 ClassLoader 加载的,因此当我添加新的类 (SkillFireball) 时,我还需要使用 Mod 的类,而不是像以前那样使用新的类。

Class<?> clazz = Loader.instance().getModClassLoader().loadClass(...)

这并不是真正的“答案”,只是一个结束问题的帖子。

关于java - 检查类(class)是否是类(class)的子类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28788387/

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