对于任何一个类class实例
,我们通过反射(获取其Class类实例
)就可以获取它的一切信息。
获取字段信息(Field类)
Class类
提供了以下几个实例方法来获取Field类
:
Field getField(String name)
:根据字段名获取某个public的field(包括父类)Field getDeclaredField(String name)
:根据字段名获取当前类的某个field(不包括父类)Field[] getFields()
:获取所有public的field(包括父类)Field[] getDeclaredFields()
:获取当前类的所有field(不包括父类)
注:可以使用void setAccessible(boolean flag)
来决定是否可以访问非public
字段。如果JVM运行期存在SecurityManager
,那么它会根据规则进行检查,有可能阻止setAccessible(true)
。
一个Field类实例
包含了一个字段的所有信息:
String getName()
:返回字段名称Class<?> getType()
:返回字段类型信息(Class类实例
,如String.class
)int getModifiers()
:返回字段的修饰符信息,Modifier类
的静态方法isXXX(如Modifier.isPublic(int)
)根据其int
返回值进行位运算来判断是否含有某个修饰符
获取/设置字段值(getter/setter)
不仅可以利用反射拿到类class
字段的一个Field类实例
,还可以利用Object get(Object obj)
方法获取类class实例
字段的具体值和void set(Object obj, Object value)
方法设置字段的值。
注:参数obj为类class实例
,若为静态字段,只需将实参obj赋为null
获取方法信息
我们不仅可以通过Class类实例
获取Field类实例
来得到字段信息,同样的,也可以获取Method类
来得到方法信息。
Class类
提供了以下实例方法来获取Method类
:
Method getMethod(name, Class...)
:获取某个public
的Method
(包括父类)Method getDeclaredMethod(name, Class...)
:获取当前类的某个Method
(不包括父类)Method[] getMethods()
:获取所有public
的Method
(包括父类)Method[] getDeclaredMethods()
:获取当前类的所有Method
(不包括父类)
注:同样含有void setAccessible(boolean flag)
方法
一个Method实例
包含一个方法的所有信息:
String getName()
:返回方法名称Class<?> getReturnType()
:返回方法返回值类型Class<?>[] getParameterTypes()
:返回方法的参数类型int getModifiers()
:返回方法的修饰符(同Field类
)
调用方法
当我们获取到一个Method类实例
时,可以通过Object invoke(Object obj, Object... args)
调用。
注:对Method
实例调用invoke
就相当于调用该方法,invoke
的第一个参数是对象实例,即在哪个实例上调用该方法,后面的可变参数要与方法参数一致。若为为静态方法,只需将obj赋为null
使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。