Kotlinベースチュートリアルの反射

2445 ワード

Kotlinベースチュートリアルの反射
概要
反射は言語とライブラリの機能のセットであり、実行時刻にプログラム自体の情報を取得することができる.Kotlinでは,取得クラスの情報を送信するだけでなく,関数や属性の情報も取得できる.すなわち、実行時に得る関数や属性の名前やデータ型)は、簡単な関数式やインタラクティブなプログラミングによって実現することができる.
Javaプラットフォームにおいて、反射機能を使用するために必要なランタイムコンポーネントは、個別のJARファイルとして発行する(kotlinreflect.jar).これは、反射機能を使用しないアプリケーションに対して、実行ライブラリのサイズを減らすためである.反射を使用する必要がある場合は、これに注意してください.JArファイルをプロジェクトのclasspathに追加します.
クラス参照
最も基本的な反射機能はKotlinクラスの実行時参照を取得することである.静的で既知のKotlinクラスの参照を得るには、クラス文字値(class literal)構文を使用します.

val c = MyClass::class

クラスリファレンスはKclassタイプの値です.
Kotlinにおいてシリーズの定数を定義、クラスの情報を表す.
  • simpleName: String? クラス名
  • qualifiedName: String? クラスのフルネーム(パッケージ名
  • を含む)
  • members: Collection

  • 関数参照
    使用::関数の参照を実現するオペレータ.高度な関数では、パラメータとして関数を使用するのが一般的で、関数パラメータを渡すときに一般的に使用される関数参照が、当時はまだよく理解されていなかったが、今ではやっと困惑している.
    
    fun main(args: Array) {
      val ages = listOf(18, 23, 17, 25)
      ages.filter(::isOld)
          .forEach(::println) //   :23,25
    }
    
    fun isOld(age: Int): Boolean = age > 20
    
    

    ここで、::isOddは(Int)->Boolean関数タイプの値です.
    クラスのメンバー関数または拡張関数を使用する必要がある場合は、限定子を使用する必要があります.例えば、String::toCharArrayはString上の拡張関数を指し、関数タイプはString.() -> CharArray
    属性参照
    Kotlinでは、以下のオペレータを使用して、パケット・レベルのプロパティをオブジェクトとしてアクセスできます.KPropertyオブジェクトのタイプを取得できます.
    
    var x = 1
    fun main(args: Array) {
      println(::x.get()) //      : "1"
      ::x.set(2)
      println(x) //      : "2"
    }
    
    

  • val属性については、KPropertyのget()関数で属性値を得ることができ、そのname属性で属性名を得ることができる.
  • varプロパティの場合、返されるプロパティオブジェクトのタイプはKMutablePropertyです.get()とnameでオブジェクトのプロパティ値とプロパティ名を取得するだけでなく、set()関数でプロパティ値を設定することもできます.
  • アクセスクラスのメンバー属性には、修飾子を使用する必要があります.返される属性オブジェクトのタイプはKProperty 1
  • です.
    コンストラクタリファレンス
    コンストラクタは、関数タイプのオブジェクトを使用する場所を参照することができるが、この関数タイプが受け入れるパラメータはコンストラクタと同じであるべきであり、戻り値はコンストラクタが属するクラスのオブジェクトインスタンスであるべきである.リファレンスコンストラクタの使用::オペレータ、クラス名を追加します.
    
     fun main(args: Array) {
        var person = newPerson("Jone", 20, "SH", ::Person)
      }
    
      fun newPerson(name: String, age: Int, address: String, factory: (String, Int, String) -> Person) : Person{
        return factory(name, age, address)
      }
    
    

    読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!