在Java中,有一种动态加载执行的技术,叫反射。简单来说,就是在你程序运行的时候,再附加加载一些类去执行。要对一个类使用反射,必须先得到该类的字节码。
获取字节码class对象
- 类名.class
- 对象.getClass()
- Class.forName("该类所在的带包名路径")
比如Person.class,person.getClass(),Class.forName("com.example.Person"),注意使用Class.forName的方式要try-catch一个ClassNotFoundException。
获取类的属性和方法
- getDeclaredField()
- getField()
- getDeclaredMethod()
- getMethod()
- getDeclaredConstructor()
- getConstructor()
getDeclared开头的是获取该类中直接声明的属性或方法,不包括该类的父类,而没有Declared的是获取该类包括继承来的所有属性或方法。
属性值get和set
field.set(obj, value) field.get(obj) obj为该类的一个对象
方法调用
method.invoke(obj, params...) constructor.invoke(obj, params...)
获取类的第一个泛型类型
private fun getGenericType(obj: Any): Class<*>? {
return if (obj.javaClass.genericSuperclass is ParameterizedType &&
(obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments.isNotEmpty()) {
(obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<*>
} else (obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<*>
}