检查班级是否是班级的孩子

时间:2015-02-28 23:51:36

标签: java classloader

我正在通过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

1 个答案:

答案 0 :(得分:0)

我做到了。

问题实际上是我缺乏关于classLoader-parenting如何工作以及Java如何加载类的知识。

通过将新的URLClassLoader设置为主程序本身使用的ClassLoader(提到的@Mod)来完成它。

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

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

这不是一个“回答”只是一个关闭问题的帖子。