反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。Kotlin中使用反射功能所需的運行時組件作為單獨的 JAR 文件(kotlin-reflect.jar)分發。這樣做是為了減少不使用反射功能的應用程序所需的運行時庫的大小。如果用Android Studio運行Kotlin項目,一般會在創建工程時,自動引入(kotlin-reflect.jar)
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))