我正在通过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
答案 0 :(得分:0)
我做到了。
问题实际上是我缺乏关于classLoader-parenting如何工作以及Java如何加载类的知识。
通过将新的URLClassLoader设置为主程序本身使用的ClassLoader(提到的@Mod)来完成它。
SkillCast.class由Mod的ClassLoader加载,因此当我添加新的Class(SkillFireball)时,我还需要使用Mod的一个,而不是像之前那样使用新的。
Class<?> clazz = Loader.instance().getModClassLoader().loadClass(...)
这不是一个“回答”只是一个关闭问题的帖子。