前言
java反射的写法,做下笔记
class MyClass {
private var name = "xiao"
private var age = 18
private fun getRandom(): Int{
return Random.nextInt(0,10)
}
}
反射用法
try {
////完整类名
val cls = Class.forName("com.example.rbq.MyClass")
//获取公开构造方法
val publicConstructors = cls.constructors
//获取全部构造方法
val declaredConstructors = cls.declaredConstructors
// 获取指定的构造方法
val targetConstructor = cls.getDeclaredConstructor(Int::class.java)
//获取公开方法
val publicMethods = cls.methods
//获取全部方法
val declaredMethods = cls.declaredMethods
//获取公开属性
val publicFields = cls.fields
//获取全部属性
val declaredFields = cls.declaredFields
//获得实例
val myClass = cls.newInstance()
//获取注解
val annotation = cls.annotations
//获取所有注解
val declaredAnnotations = cls.declaredAnnotations
// 获取类的加载器
val classLoader = cls.classLoader
//获取方法的返回类型
val returnType= publicMethods[0].returnType
//获取方法的传入参数类型
val paramType = publicMethods[0].parameterTypes
//是否一个注解类
val isAnnotation = cls.isAnnotation
//获取这个类的父类
val superCls = cls.superclass
// 获取这个类实现的所有接口(不包含泛型信息)
val interfaces1 = cls.interfaces
// 获取这个类实现的所有接口(包含泛型信息)
val interfaces2 = cls.genericInterfaces
//获得私有方法
val getRandom = cls.getDeclaredMethod("getRandom")
//调用方法前,设置访问标志
getRandom.isAccessible = true
val num = getRandom.invoke(myClass) as Int
println("s:$num")
} catch (e: ClassNotFoundException) {
e.printStackTrace();
} catch (e: IllegalAccessException) {
e.printStackTrace();
} catch (e: InstantiationException) {
e.printStackTrace();
} catch (e: NoSuchMethodException) {
e.printStackTrace();
} catch (e: InvocationTargetException) {
e.printStackTrace();
}