通过反射可以直接获取对象的变量值(private\public\protected\包\静态)、调用对象的内部方法(private\public\protected\包\静态)、有参无参构造方法,但当使用这套方法调用对象的父类成员或方法时,却不能用了,你可能会遇到变量不存在,没权限访问问题。那么访问父类成员的方法又是什么呢?答案如下:
/**
* 获取对象的父类成员值
* 例子:
* Object value=getValue(Base.class, grand, "name");
*
* @param classType object对象的父类
* @param object 对象
* @param fieldName 成员名
* @return
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static Object getValue(Class<?> classType, Object object, String fieldName) throws NoSuchFieldException, IllegalAccessException {
Field field = classType.getDeclaredField(fieldName);
if (!field.isAccessible()) {
field.setAccessible(true);
}
return field.get(object);
}
/**
* 设置对象的父类成员值
* 例子:
* invokeValue(Base.class, grand, "name", "new value");
*
* @param classType object对象的父类
* @param object 对象
* @param fieldName 成员名
* @param value 值
* @throws IllegalAccessException
* @throws NoSuchFieldException
*/
public static void invokeValue(Class<?> classType, Object object, String fieldName, Object value) throws IllegalAccessException, NoSuchFieldException {
Field field = classType.getDeclaredField(fieldName);
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(object, value);
}
/**
* 调用对象父类的内部方法(private,proteced,public)
* 例子:
* invokeMethod(PackageClass.class, grand, "getValue", new Class[]{String.class}, "extension");
* @param classType 对象父类
* @param object 对象
* @param methodName 方法名
* @param parameterTypes 方法参数类型数组
* @param args 参数值
* @return
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static Object invokeMethod(Class<?> classType, Object object, String methodName, Class<?>[] parameterTypes, Object... args) throws
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = classType.getDeclaredMethod(methodName, parameterTypes);
if (!method.isAccessible()) {
method.setAccessible(true);
}
return method.invoke(object, args);
}