JavaからKotlin(七)へ

6793 ワード

反射と注記
目次
  • 1.反射1.1クラス参照1.2関数参照1.3属性参照
  • 2.注記2.1注記2.2コンストラクション関数
  • を宣言する
    1.反射
    反射メカニズムは、実行状態において、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができる.任意のオブジェクトに対して、java言語の反射メカニズムと呼ばれる動的に取得された情報および動的にオブジェクトを呼び出す方法の機能を呼び出す任意の方法および属性.Kotlinで反射機能を使用するために必要なランタイムコンポーネントは、個別のJARファイル(kotlin-reflect.jar)として配布されます.これは、反射機能を使用しないアプリケーションに必要なランタイムライブラリのサイズを減らすためです.Android StudioでKotlinプロジェクトを実行すると、一般的にエンジニアリング作成時に自動的に導入されます(kotlin-reflect.jar)
    1.1クラス参照
  • Javaコード
  • //   
    Class> clazz = User.class;
    //   
    Class> clazz = Class.forName("  .User");
    
  • Kotlinコード
  • //  User Kotlin  
     var user = User::class
    //  User Java  
     var user = User::class.java
    

    Kotlinでは、クラス名+2つのコロン::+class(javaクラスであれば.javaを後に付ける)で、このクラスを取得したオブジェクトを表します.
    1.2関数参照
  • Javaコード
  • public class User {
        private String userName;
    
        public User(String userName) {
            super();
            this.userName = userName;
        }
    
        public void printUserName() {
            System.out.println(userName);
        }
    }
    
    //  User  
    Class> clazz = Class.forName("com.demo.czh.myapplication.User");
    //   String   public    
    Constructor c=clazz.getDeclaredConstructor(String.class);
    //  User     
    User user = (User) c.newInstance("Czh");
    //     "printUserName"   method   
    Method method = clazz.getDeclaredMethod("printUserName");
    //   method    invoke()  ,  User   printUserName
    method.invoke(user);
    

    コードの実行結果:
  • Kotlinコード
  • class User(var userName: String) {
        fun printUserName() {
            println(userName)
        }
    }
    
    //   
    //  printUserName    
    var p = User::printUserName
    //  invoke()    printUserName  
    p.invoke(User("Czh"))
    
    //   
    //  Java      getMethod()  ,       "printUserName"
    var method = User::class.java.getMethod("printUserName")
    //  invoke()  
    method.invoke(User("Czh"))
    

    コードの実行結果:
    Kotlinでは、クラス名+2つのコロン::+関数名でこの関数のオブジェクトを直接取得できます.あるいは、Java反射メカニズムを用いてgetMethod()メソッドを呼び出して関数のオブジェクトを取得する.
    1.3属性参照
  • Javaコード
  • public class User {
        public String userName;
    }
    
    //  User  
    Class> clazz = Class.forName("com.demo.czh.myapplication.User");
    //  User     
    User user = (User) clazz.newInstance();
    //  Field         "userName"
    Field field = clazz.getField("userName");
    //  set()   userName  
    field.set(user, "Czh");
    //  get()    userName  
    System.out.println(field.get(user));
    

    コードの実行結果:
  • Kotlinコード
  • class User {
        var userName: String = "Czh"
            get() = field
            set(value) {
                field = value
            }
    }
    
    //   
    var user = User()
    //      
    var userName = User::userName
    println(userName.get(user))
    //     
    userName.set(user, "James")
    //     
    println(userName.get(user))
    
    //   
    //  Java      getUserName  
    var getName = User::class.java.getMethod("getUserName")
    //  Java      setUserName  
    var setName = User::class.java.getMethod("setUserName", java.lang.String().javaClass)
    //     
    setName.invoke(user, "Harden")
    //     
    println(getName.invoke(user))
    

    コードを実行し、結果を得る:Kotlinでは、クラス名+2つのコロンを使用できます.::+属性名直接取得属性オブジェクト;あるいはJava反射メカニズムによって属性を取得するget/setメソッドは、属性値を取得または変更するために使用される.
    2.注記
    2.1注記の宣言
    Java宣言コメント
    public @interface MyAnnotation {
    }
    

    Kotlinコメント宣言
    annotation class MyAnnotation
    

    注記の追加プロパティは、メタ注記で注記クラスを注釈することで指定できます.
  • @Targetこの注釈で表記できる要素の可能なタイプ(クラス、関数、属性、式など)を指定し、
  • .
  • @Retentionは、注釈がコンパイルされたclassファイルに格納されているかどうか、および実行時に反射で表示できるかどうかを指定します(デフォルトはtrue).
  • @Repeatableは、単一の要素上で同じ注釈を複数回使用することを可能にする.
  • @MustBeDocumentedは、注釈がパブリックAPIの一部であり、生成されたAPIドキュメントに表示されるクラスまたはメソッドの署名に含まれるべきであることを指定する.

  • Javaメタ注記の追加
    @Target(ElementType.METHOD)//          
    @Retention(RetentionPolicy.RUNTIME)//       
    public @interface MyAnnotation {
    }
    

    Kotlin追加メタ注記
    @Target(AnnotationTarget.FUNCTION)//          
    @Retention(AnnotationRetention.RUNTIME)//       
    annotation class MyAnnotation
    

    2.2コンストラクタ
    注記クラスにはコンストラクション関数を含めることができます
  • Kotlinコード
  • annotation class MyAnnotation(val value: Int)
    
    //  
    @MyAnnotation(1)
    class Foo {
    }
    
  • Javaコード
  • public @interface MyAnnotation {
        int value();
    }
    
    //  
    @MyAnnotation(1)
    public class Foo {
    }
    

    注記クラスのコンストラクション関数では、次のパラメータタイプのみが許可されます.
  • Javaネイティブタイプ(Int、Longなど)に対応;
  • 文字列;
  • クラス(Foo::class);
  • 列挙;
  • その他の注釈;
  • 上に列挙されたタイプの配列.
  • Kotlinではvalでパラメータ
  • のみを宣言できます.
  • パラメータタイプが他の注釈である場合、その注釈クラスの名前の前に@
  • は使用できません.
    まとめ
    注釈と反射は多くの応用で用いられる技術であるが,本論文では主にJavaとKotlinにおける注釈と反射の書き方の違いを比較した.
    参考文献:Kotlin言語中国語ステーション、『Kotlinプログラム開発入門要旨』
    推荐阅读:JavaからKotlin(一)なぜKotlinを使用してJavaからKotlin(二)基本文法JavaからKotlin(三)クラスとインタフェースJavaからKotlin(四)オブジェクトと汎用JavaからKotlin(五)関数とLambda式JavaからKotlin(六)への拡張と委託JavaからKotlin(七)への反射と注釈JavaからKotlinへ(八)Kotlinのその他の技術Kotlin学習資料のまとめ
    もっと素晴らしい文章は下のQRコードをスキャンして、微信の公衆番号「Android Czh」に注目してください.ここではオリジナルの文章、Androidの開発経験などを長期にわたって共有します.QQ交流群:705929135