Получение доступа к классу в режиме рантайм добавляет известной гибкости. Одна из типичных задач — создание экземпляра класса по его имени.
В котлин это делается вот так:
1 2 3 |
import java.lang.Class.forName; var className = "MyClassName"; val obj = forName(className).newInstance(); |
Есть несколько нюансов/рекомендаций.
Во-первых, IDE будет требовать от вас типизации для переменной obj. Здесь вы, скорее всего, будете использовать наследование некой группы классов от общего родителя или интерфейса. Т.е. className вероятнее всего принимает имена родственных классов.
У меня это были разные игровые локации, которые имели общего родителя Location.
1 |
val loc = forName(className).newInstance() as Location; |
Второй нюанс заключается в том, что лучше использовать полное имя класса, если класс находится в другом пакете. Т.е. это что то вида:
1 |
val className = "com.myApp.packagename.ClassName" |
Ну и в третьих, не пренебрегайте обработкой исключений, если уж имя класса у вас вычисляется рантайм.
1 2 3 4 5 6 7 8 |
try { val loc = forName(className).newInstance() as Location; ... } catch (e: ClassNotFoundException) { // класс не найден, обработайте ошибку ... } |