У меня есть набор классов, которые расширяют общий класс. Этот класс в свою очередь реализует интерфейс.
Я хочу иметь возможность создавать экземпляры объектов, которые расширяют этот класс на основе некоторого строкового значения, используя отражение.
Интерфейс
public interface Vehicle {
public String reportStats();
}
Общий класс
public class Premium implements Vehicle {
public String reportStats() {
return "generic stats";
}
}
Один тип
public class Volvo extends Premium {
public void drive() {
// impl
}
}
Другой тип
public class Mercedez extends Premium {
public void drive() {
// impl
}
}
Попытка создания экземпляра с использованием отражения
String objectStr = "org.test.project.impl.Volvo";
Class<? extends Vehicle> vehicleClass;
vehicleClass = (Class<? extends Vehicle>) Class.forName(objectStr);
// this does not work
// the error that i get is Volvo cannot be casted to Vehicle
Vehicle vehicle = vehicleClass.cast(vehicleClass.newInstance());
String stats = vehicle.reportStats();
Похоже, что это работает, если классы находятся в одной и той же банке, но если Mercedez или Volvo разложены в отдельную банку в том же пакете, произойдет сбой приведения с java.lang.ClassCastException.
Спасибо.