Java反射


关于反射原理性的知识可以看看类加载流程,对象实例化流程相关的文章,这里说一下反射的常用使用方法。

获取Class

  • Class.forName

  • ClassA.class

  • classA.getClass

Class常见方法

  • isPrimitive()

    是否为基础类型,如int,long,byte,boolean,char,short,double等

  • getFiled()

    返回所有public成员变量的field对象,包括从父类继承的field对象

  • getDeclaredField()

    返回当前类本身所有的field,包括private的field,但是不包括从父类继承的

  • getMethods()/getMethod()/getDeclaredField()

    与上面的Field相同

    getMethods()返回类的所有public方法

    public Method getMethod(String name, Class<?>... parameterTypes)

    后面传的是参数的类型

  • getConstructors()/ getConstructor(Class<?>… parameterTypes)/getDeclaredConstructors()/getDeclaredConstructor()

    获取构造方法

Field常用方法

  • get(Object obj)

    获取Filed的值,如果不是静态字段,需要传入类的对象,如果是静态字段,传入null或者任何对象都可以.

  • set(Object obj, Object value)

    将Object的这个Filed的值设置成value

  • setAccessible(true)

    修改之前设置Field可以被访问

  • getType()

    返回Filed 的类型class,如果属性是泛型,这个方法只能获取到接口类型,即HashMap<K,V>,只能获取到HashMap

  • getGenericType()

    返回属性声明的Type对象,如果是泛型,可以获取到具体的参数类型,不如HashMap<K,V>

  • getName()

    获取Field声明的时候的名字

  • getAnnotations()/getDeclearedAnnotation()/getAnnotation()

    获取这个Field上的注解

  • getModifiers()

    获取Filed上的修饰符,返回的是一个int,需要使用Modifier类才能知道具体的修饰符是什么(public,private,static,final等)

  • isEnumConstant()

    判断这个Field是否为枚举类型

  • isSynthetic()

    判断这个Filed是否为复合类型,即是否为编译期自动生成的Field

Method常用方法

  • invoke(Object obj, Object… args)

    执行该Method,obj是对象(如果是静态方法可以直接传null),args是入参,这个方法返回值总是对象,如果是基本类型,则返回包装类型,比如int返回Integer.

Constructor

  • newInstance(Object … initargs)

    通过构造方法创建对象,传入的参数是构造方法的参数.

    Class.newInstance()也可以用来创建对象,它获取的是类的默认构造方法(无参),并存在缓存机制保存实例对象.

Array

反射包中也有一个Array.

  • 创建数组

    newInstance()

  • setXX

  • getXX

  • getLength()


文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
git不常见操作 git不常见操作
删除所有commit记录git checkout --orphan local_branch git add -A git commit -am "reset commits" git branch -D master git branc
2020-07-27
下一篇 
Hook点击事件 Hook点击事件
Hook的本质就是就是利用Java反射机制,将源码中一些类的对象替换自己实现的对象,以实现一些特殊的操作. 基本上所有Hook的入门都会从Hook一个View的点击事件开始. Hook之前,一般都得先看看源码,以找到如何反射,如何替换比较合
2020-07-25
  目录