对于任何一个类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
使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。
调用构造方法
我们一般使用new操作符创建新的实例。如果通过反射创建新的实例,可以调用Class类提供的newInstance()方法。
newInstance()方法的局限在于,它只能调用类class的public的无参构造方法。
为了调用任意的构造方法,Java的反射API提供了Constructor类,它包含一个构造方法的所有信息。通过Constructor实例可以创建一个实例对象:T new Instance(Object... parameters)。
Class类提供了以下实例方法来获取Construct类:
Constructor<T> getConstructor(Class...):获取某个public的ConstructorConstructor<T> getDeclaredConstructor(Class...):获取某个ConstructorConstructor<?>[] getConstructors():获取所有public的ConstructorConstructor<?>[] getDeclaredConstructors():获取所有Constructor
注:同样含有void setAccessible(boolean flag)方法
本文转载自: 掘金