2016-10-27 2 views
7

Я разрабатываю генератор кода, который берет данные из классов во время выполнения. Этот генератор предназначен для работы только с Kotlin. На данный момент я столкнулся с проблемой, так как не знаю, как проверить, является ли поле нулевым.Kotlin. Как проверить, является ли поле нулевым путем отражения?

Итак, главный вопрос заключается в том, как реализовать эту проверку через отражение?

ответ

8

Вы можете проверить значение nullability с помощью isMarkedNullable. Следующий код:

class MyClass(val nullable: Long?, val notNullable: MyClass) 
MyClass::class.declaredMemberProperties.forEach { 
    println("Property $it isMarkedNullable=${it.returnType.isMarkedNullable}") 
} 

напечатает:

Property val MyClass.notNullable: stack.MyClass isMarkedNullable=false 
Property val MyClass.nullable: kotlin.Long? isMarkedNullable=true 

Отрывок из documentation (курсив мой):

Для типов Котлин, это означает, что нулевое значение позволено быть представлены таким образом. На практике это означает, что тип был , объявленный с вопросительным знаком в конце. Для типов, отличных от Kotlin, это означает, что тип или символ, который был объявлен с этим типом, составляет , аннотированный аннотацией с нулевым значением, сохраненной во время выполнения, такой как javax.annotation.Nullable.

Обратите внимание, что даже если isMarkedNullable ложно, значение типа может все еще null. Это может произойти, если это тип параметра типа с обнуляемой верхней границей:

fun <T> foo(t: T) { 
    // isMarkedNullable == false for t's type, but t can be null here 
} 
+0

вы могли бы дать ссылку на документацию? –

+0

@ KirillRakhman это там в первой строке. – miensol

+0

Простите, пропустил это. –

Смежные вопросы