日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习Kotlin(七)反射和注解

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习Kotlin(七)反射和注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

推薦閱讀:
學習Kotlin(一)為什么使用Kotlin
學習Kotlin(二)基本語法
學習Kotlin(三)類和接口
學習Kotlin(四)對象與泛型
學習Kotlin(五)函數與Lambda表達式
學習Kotlin(六)擴展與委托
學習Kotlin(七)反射和注解
學習Kotlin(八)其他技術
Kotlin學習資料總匯

?

目錄

  • 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中,用類名+兩個冒號::+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中,可以用類名+兩個冒號::+函數名直接獲取這個函數的對象;或者利用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() = fieldset(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中,可以用類名+兩個冒號::+屬性名直接獲取屬性對象;或者通過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中寫法的差別。


原文鏈接:https://juejin.im/post/5a98c613518825558722f7b8

總結

以上是生活随笔為你收集整理的学习Kotlin(七)反射和注解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。