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コード Kotlinコード
Kotlinでは、クラス名+2つのコロン
1.2関数参照 Javaコード
コードの実行結果: Kotlinコード
コードの実行結果:
Kotlinでは、クラス名+2つのコロン
1.3属性参照 Javaコード
コードの実行結果: Kotlinコード
コードを実行し、結果を得る:Kotlinでは、クラス名+2つのコロンを使用できます.
2.注記
2.1注記の宣言
Java宣言コメント
Kotlinコメント宣言
注記の追加プロパティは、メタ注記で注記クラスを注釈することで指定できます. .
Javaメタ注記の追加
Kotlin追加メタ注記
2.2コンストラクタ
注記クラスにはコンストラクション関数を含めることができます Kotlinコード Javaコード
注記クラスのコンストラクション関数では、次のパラメータタイプのみが許可されます. 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
目次
1.反射
反射メカニズムは、実行状態において、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができる.任意のオブジェクトに対して、java言語の反射メカニズムと呼ばれる動的に取得された情報および動的にオブジェクトを呼び出す方法の機能を呼び出す任意の方法および属性.Kotlinで反射機能を使用するために必要なランタイムコンポーネントは、個別のJARファイル(kotlin-reflect.jar)として配布されます.これは、反射機能を使用しないアプリケーションに必要なランタイムライブラリのサイズを減らすためです.Android StudioでKotlinプロジェクトを実行すると、一般的にエンジニアリング作成時に自動的に導入されます(kotlin-reflect.jar)
1.1クラス参照
//
Class> clazz = User.class;
//
Class> clazz = Class.forName(" .User");
// User Kotlin
var user = User::class
// User Java
var user = User::class.java
Kotlinでは、クラス名+2つのコロン
::
+class(javaクラスであれば.javaを後に付ける)で、このクラスを取得したオブジェクトを表します.1.2関数参照
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);
コードの実行結果:
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属性参照
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));
コードの実行結果:
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コンストラクタ
注記クラスにはコンストラクション関数を含めることができます
annotation class MyAnnotation(val value: Int)
//
@MyAnnotation(1)
class Foo {
}
public @interface MyAnnotation {
int value();
}
//
@MyAnnotation(1)
public class Foo {
}
注記クラスのコンストラクション関数では、次のパラメータタイプのみが許可されます.
まとめ
注釈と反射は多くの応用で用いられる技術であるが,本論文では主に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