Получение класса по имени

Если в моем приложении есть класс Activity с именем TestActivity, есть ли способ получить его класс по имени, как в этом примере:

<code>Class<?> c = getClassByName("TestActivity");
</code>
 Code_Life12 апр. 2012 г., 10:30
Пожалуйста, выберите правильный ответ и закройте пост

Ответы на вопрос(5)

это не самый подходящий ответ на ваш вопрос, но, как правило, плохо использовать литералы имен классов в виде строк. Может быть лучше использовать

Class<?> act = TestActivity.class;

синтаксис.

 12 июн. 2018 г., 11:30
Вы не всегда можете знать заранее.

Class.forName кажется, есть исключения на это. Это просто, чтобы расширить вышеупомянутое, чтобы обратиться к этой проблеме.

com.package.classname"); } catch (Exception ignored){}
 29 мая 2015 г., 13:03
Обычный способ ответить так:edit их ответ. Хотя в Java много исключений (а ваш код просто игнорирует их),comment было бы достаточно для решения этой проблемы.
 20 авг. 2015 г., 15:29
@crazyhatfish - Кажется, что Патрик, возможно, не имел привилегий, чтобы сделать что-нибудь полезноеexcept опубликовать свой ответ.
 01 сент. 2015 г., 00:09
@amess Упс, ваше право, я забываю комментарии нужно респ. Спасибо, что поправили меня.

Ты можешь использоватьClass::forName получить объект класса неизвестного типа. Если вы хотите получить типизированный класс, вы можете использоватьClass::asSubclass в классе, возвращенномClass::forName:

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
                                               .asSubclass(Activity.class);

Конечно, вам также придется обрабатывать различные типы исключений. Как обычно при работе с отражением.

у меня был json из бэкэнда, который содержит экран и отображение активности. Так как json является общим для iOS / Android, мы не можем добавить такие термины, какActivity в JSON, так что это то, что мы сделали

In json for all Activity or Viewcontrollers, use simple names ie for HomeActivity and HomeViewController we will use "Home" in the json

In app, we parse the json and I have written the below utility methods to get the activity dynamically

Чтобы получить имя класса (т.е. если мы передадим Home, мы вернемсяcom.package.HomeActivity)

    fun getClassInfoFor(name: String, context: Context):String{
        var str = "${context.getPackageName()}.${name}Activity"
        return str
    }

Теперь, чтобы получить класс из строки

        try {
            val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
            val fetchedClass = Class.forName(className)
            val showDetailsIntent = Intent(context, fetchedClass)
            context.startActivity(showDetailsIntent)
        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        }

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

 10 нояб. 2018 г., 09:34
Это круто... :)
 02 мар. 2019 г., 16:40
Обратите внимание, что ваш ответ на Kotlin;) Возможно, немного измените его, чтобы сделать его Java?
Решение Вопроса

forName вместо..

что-то вроде этого..

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}
 05 янв. 2018 г., 14:28
@Gobliins Проверьтеmy answer о том, как получить подкласс определенного типа.
 21 мар. 2017 г., 13:40
Вы также можете сделать что-нибудь, чтобы получитьClass<? extends SomeClass> ?
 12 апр. 2012 г., 10:32
Вы также должны указать полное название пакета. Например: com.bla.TestActivity в качестве аргумента для Class.forName
 27 июл. 2017 г., 01:34
@Gobliins Нет - компилятор не может гарантировать, какой класс вы собираетесь получить, поэтому он предоставляет вам класс & lt;? & Gt ;. Если вы знаете, какой класс вы собираетесь получить, вам придется его разыграть (даже если вы все равно получите непроверенные предупреждения, потому что приведение не безопасно).

Ваш ответ на вопрос