什么是反射-灵析社区

chole

在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<*>
    }


阅读量:652

点赞量:0

收藏量:0