Возвращение и экземпляр класса с учетом его .class (MyClass.class) - PullRequest
3 голосов
/ 26 мая 2010

У меня есть перечисление, которое будет содержать мои алгоритмы. Я не могу создать экземпляр этих классов, потому что мне нужен контекст приложения, который доступен только после запуска приложения. Я хочу загрузить класс во время выполнения, когда я выбираю, вызывая getAlgorithm (Context cnx).

Как мне легко создать экземпляр класса во время выполнения, учитывая его .class (и мой конструктор принимает аргументы)? Все мои классы являются подклассами Алгоритма.

public enum AlgorithmTypes {
ALL_FROM_9_AND_LAST_FROM_10_ID(AlgorithmFactory.AlgorithmAllFrom9AndLastFrom10Impl.class),
ALL_FROM_9_AND_LAST_FROM_10_CURRENCY_ID(AlgorithmFactory.AlgorithmAllFrom9AndLastFrom10Impl.class),
DIVIDE_BY_9_LESS_THAN_100(AlgorithmFactory.AlgorithmAllFrom9AndLastFrom10Impl.class),
TABLES_BEYOND_5_BY_5(AlgorithmFactory.AlgorithmAllFrom9AndLastFrom10Impl.class);

private Class<? extends Algorithm> algorithm;

AlgorithmTypes(Class<? extends Algorithm> c) {
    algorithm = c;
}

public Algorithm getAlgorithm(Context cnx) {
    return //needs to return the current algoriths constructor which takes the Context Algorithm(Context cnx);
}

}

Ответы [ 2 ]

1 голос
/ 26 мая 2010

java.lang.Class<T> имеет всю необходимую магию, в частности, вы можете использовать методы forName() и getConstructor(), чтобы получить желаемый эффект, как показано ниже:

public Constructor getAlgorithm(Context cnx) {
    Class klass = Class.forName("YourClassName"));
    Constructor constructor = klass.getConstructor(cnx.getClass());
    return constructor;
}

Если вы хотите, чтобы getAlgorithm возвращал экземпляр, а не только конструктор для вызова, вы можете вызвать конструктор:

public Algorithm getAlgorithm(Context cnx) {
    Class klass = Class.forName("YourClassName"));
    Constructor constructor = klass.getConstructor(cnx.getClass());
    return constructor.newInstance(ctx);
}
1 голос
/ 26 мая 2010

Вы можете использовать функцию Class. getConstructor () для получения конструктора, а затем вы можете использовать Constructor. newInstance () для создания экземпляра класса, в то время как передача аргументов конструктору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...