Как уже упоминалось в другом ответе, это невозможно, используя чисто отражение.
Если вы не можете настроить свои классы специально для этого случая, вам нужно будет погрузиться либо в итерацию по классам из загрузчика классов, либо с помощью специального загрузчика классов, который добавляет информацию во внутреннюю структуру данных, чтобы при он запрашивается позже, вам не нужно повторять все классы.
Предполагая, что вас не интересует погружение в код загрузчика классов (похоже, что это не так), следующий лучший способ сделать это - добавить статический код к вашим классам, который запускается во время загрузки класса. Например:
public class Animal {
protected static List subclasses = new ArrayList();
//...
}
public class Cat extends Animal {
static {
subclasses.add(Cat.class);
}
//...
}
Это было бы по существу то, что вы могли бы сделать с пользовательским загрузчиком классов, где этот код будет жить в загрузчике класса вместо класса.
Повторите этот шаблон для всех подклассов. Затем, когда вы хотите создавать экземпляры, у вас есть ссылки на классы внутри списка subclasses
, которые вы должны создать с помощью Class.newInstance
(или другого подходящего метода отражения, если ваши конструкторы имеют аргументы).
Полиморфизм .... – DGomez
неясно ваш вопрос – nachokk
Это, кажется, домашняя работа или задание. –