2015-02-28 3 views
1

Я погрузочные классы через 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?

EDIT

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. Мой мод предоставляет SkillCast.class и при загрузке пытается прочитать каталог игр и загружать классы в .jar-файлы. Теперь - я не очень понимаю, что мне делать: C

+0

'SkillCast.class.isAssignableFrom (clazz)' * does * tel, если 'clazz' является подклассом' SkillCast'. Вы уверены, что у вас нет более одного класса под названием SkillCast (в том числе, когда тот же файл класса загружается разными загрузчиками классов)? – immibis

+0

Уверен, что есть только один SkillCast. Что может быть важно, так это тот факт, что SkillCast загружается с помощью другого класса ClassLoader (основная программа), а фактические навыки.jar загружаются с использованием другого классаLoader - может это проблема? – Ernio

+1

Если один и тот же файл классов загружается двумя разными загрузчиками классов, это создает два разных класса. – immibis

ответ

0

Я сделал это.

Проблема была в самом деле в моей нехватке знаний о том, как работает классLoader-parenting и как Java загружает классы.

Выполнено, создав новый URLClassLoader с родительским набором ClassLoader, который используется самой главной программой (упомянутый @Mod).

SkillCast.class загружается модулем ClassLoader, поэтому, когда я добавил новый класс (SkillFireball), мне также понадобилось использовать одно, а не новое, как раньше.

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

Это не «ответ», а только сообщение о закрытии проблемы.

Смежные вопросы