上一篇文章我们讲了怎么获取到类的标识符,比如类的访问权限、接口标识、static标识,final标识、strictfp标识等,下面我们继续跟着官方文档讲解一下怎么获取类的成员,类成员包括以下三种:成员变量、类方法(实例方法和类方法)、构造器(构造方法)。
获取方式
为了更好的描述,我们做个约定个通配符XXXX,如果是成员变量就代表Field,如果是类方法就代表Method,如果是构造器就代表Constructor。
那么怎么获取到这三类成员呢?
获取单个的成员的方式用: getXXXX()和getDeclaredXXXX();
列举多个成员的方式用: getXXXXs()和getDeclaredXXXXs();
getXXXX和getDeclared的区别
那么他们有什么区别呢?
简单的来说普通的方式(不带Declared)获取类的公共(public)的成员,包括父类,带有Declared的方式获取类的所有申明的成员,即包括public、private和protected声明的成员,不包括父类的申明字段。
那么就有人疑问那怎么获取到父类的成员呢?当然是获取到父类的Class之后,通父类的Class调用这两类方法获取。
普通的方式是比较常用的方式,反射本身就破坏封装的一种方式,为了减少这种破坏,我们应该操作public成员即可。
具体的区别如下:
获取成员变量
Class的API方法 | 是否可以列举 | 是否能列举继承类的成员 | 是否能列举私有成员 |
---|---|---|---|
getDeclaredField() | 否 | 否 | 是 |
getField() | 否 | 是 | 否 |
getDeclaredFields() | 是 | 否 | 是 |
getFields() | 是 | 否 | 否 |
获取成员方法
Class的API方法 | 是否可以列举 | 是否能列举继承类的成员 | 是否能列举私有成员 |
---|---|---|---|
getDeclaredMethod() | 否 | 否 | 是 |
getMethod() | 否 | 是 | 否 |
getDeclaredMethods() | 是 | 否 | 是 |
getMethods() | 是 | 否 | 否 |
获取构造器
Class的API方法 | 是否可以列举 | 是否能列举继承类的成员 | 是否能列举私有成员 |
---|---|---|---|
getDeclaredConstructor() | 否 | 否 | 是 |
getConstructor() | 否 | 是 | 否 |
getDeclaredConstructors() | 是 | 否 | 是 |
getConstructors() | 是 | 否 | 否 |
类成员的Class
getXXXX()和getDeclaredXXXX()获取到的类也就是类成员的Class,对应的Class如下.
成员变量: java.lang.reflect.Field
成员方法: java.lang.reflect.Method
构造器方法: java.lang.reflect.Constructor
后面会分为三章分别解释一下对应的用法。