Как я могу динамически создать экземпляр класса в java? - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы создать объект динамически.

У меня есть следующая структура: 1 абстрактный класс и несколько классов, которые наследуются от абстрактного класса

abstract public class A {..}


public class B extends A{..}
public class C extends A{..}

У меня есть файл конфигурации где я хочу добавить имя класса, чтобы иметь возможность контролировать, какой класс он должен использовать.

# config class name
 classname = B

Я попробовал следующее, но здесь у меня есть проблема, что я должен привести результат и Я не знаю, как я могу сделать это динамически в этот момент

public class TestClass {

  public A instB;

  public void getInstance(){
    this.instB = Class.forName("B") /*here i put later the config value classname*/
    .getConstructor(String.class)
    .newInstance(new Object[]{"test"});   // <--- How to cast this dynamicly to a class in the config?
  }
}

Как я могу динамически создать экземпляр класса?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020

Просто приведите его к A:

instB = (A)Class....newInstance(...);

Вам не нужно знать точный класс.

0 голосов
/ 09 февраля 2020

Я не вижу смысла, почему вам действительно нужно использовать отражение . Я бы предложил использовать простой шаблон стратегии , например:

Strategy. java

public interface Strategy {
    void doWork();
}

StrategyA. java

public class StrategyA implements Strategy {
    @Override
    public void doWork() {
    }
}

Стратегия B. java

public class StrategyB implements Strategy {
    @Override
    public void doWork() {
    }
}

Main. java

public class Main {

    public static void main(String[] args) {
        // read the option from a config file
        String option = "B";
        Strategy strategy = createStrategy(option);

        // create a context with the strategy
        MyContext context = new MyContext(strategy);
        context.doWork();

        // config has changed dynamically, change the strategy
        context.useStrategy(new StrategyA());
        context.doWork();
    }

    public static Strategy createStrategy(String strategy) {

        if (strategy.equals("A")) {
            return new StrategyA();
        }

        return new StrategyB();
    }
}

MyContext. java

public class MyContext {
    Strategy strategy;

    public MyContext(Strategy strategy) {
        this.strategy = strategy;
    }

    public void useStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void doWork() {
        strategy.doWork();
    }
}
0 голосов
/ 09 февраля 2020

Вы можете сделать это следующим образом:

import java.lang.reflect.Constructor;
public class Main {    
    A instB = (B) getInstance("B");    
    public Object getInstance(String className) {
        Class<?> myClass = null;
        try {
            myClass = Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Constructor<?> constructor = myClass.getConstructors()[0];
        return constructor;
    }
}
...