Это довольно легко, если все ваши плоды реализуют общий интерфейс.Гораздо сложнее, если они этого не делают, до такой степени, что я бы, вероятно, предложил вообще использовать другой язык.Java не подходит для этого.
Если они реализуют общий интерфейс, вы можете использовать Class.forName
, чтобы получить класс, а затем getConstructor
, чтобы иметь возможностьдля создания экземпляров объектов:
Базовый интерфейс (ваш, вероятно, объявил бы более полезное поведение):
public interface Fruit {
String getName();
}
Apple:
public class Apple implements Fruit {
private final Fruit child;
public Apple(final Fruit child) { this.child = child; }
@Override
public String getName() {
return "I am an apple " + (child == null ? "" : child.getName());
}
}
Банан может быть в основном идентичным Appleпросто с другим именем.
Клубника:
public class Strawberry implements Fruit {
@Override
public String getName() {
return "I am a strawberry";
}
}
Основной метод приведен ниже.Нам нужно выполнить итерацию в обратном порядке по массиву, чтобы сначала построить дочерние объекты.
@SuppressWarnings("unchecked")
public static void main(final String... args) throws Exception
{
String[] splitted = {"Apple", "Banana", "Strawberry"};
Fruit prevFruit = null;
for (int i = splitted.length - 1; i >= 0; --i)
{
final String className = splitted[i];
final Class<? extends Fruit> clazz = (Class<? extends Fruit>) Class.forName("my.pckage." + className);
if (prevFruit == null) // if first, use no-arg constructor
{
prevFruit = clazz.getConstructor().newInstance();
}
else
{
prevFruit = clazz.getConstructor(Fruit.class).newInstance(prevFruit);
}
}
System.out.println(prevFruit.getName());
}
Пример вывода:
Я - яблоко Я - банан Я -клубника