先贴代码,方法使用注释已经写得很清楚了
/**
* 获取指定对象中指定属性名的值
*
* @param obj 对象
* @param propertyName 字段名
* @return 属性值
* @throws IllegalAccessException 非法访问异常
*/
public static Object getPropertyValue(Object obj, String propertyName) throws IllegalAccessException {
Class<?> aClazz = obj.getClass();
Field field;
if ((field = getField(aClazz, propertyName)) == null) {
return null;
}
field.setAccessible(true);
return field.get(obj);
}
/**
* 获取class中指定字段名的字段对象,找不到往父类中找
*
* @param clazz class
* @param propertyName 字段名
* @return 字段对象
*/
public static Field getField(Class<?> clazz, String propertyName) {
if (clazz == null) {
return null;
}
try {
return clazz.getDeclaredField(propertyName);
} catch (NoSuchFieldException e) {
return getField(clazz.getSuperclass(), propertyName);
}
}
/**
* 根据指定值获取指定对象中的字段名
*
* @param obj 对象
* @param value 字段对应的值
* @return 字段名
* @throws IllegalAccessException 非法访问异常
*/
public static String getFieldNameByValue(Object obj, String value) throws IllegalAccessException {
Class<?> aClass = obj.getClass();
Field[] declaredFields = getDeclaredFields(aClass);
if (declaredFields != null) {
for (Field declaredField : declaredFields) {
String name = declaredField.getName();
Object propertyValue = getPropertyValue(obj, name);
if (propertyValue instanceof String && propertyValue.toString().equals(value)) {
return name;
}
}
}
return null;
}
/**
* 获取此class中的所有字段,找不到往父类找,注意有可能发生堆栈溢出错误{@link StackOverflowError}
*
* @param aClass class
* @return 字段数组
*/
public static Field[] getDeclaredFields(Class<?> aClass) {
if (aClass == null) {
return null;
}
Field[] declaredFields = aClass.getDeclaredFields();
return declaredFields.length == 0 ? getDeclaredFields(aClass.getSuperclass()) : declaredFields;
}
PS:由于实际业务问题目前只支持String类型的获取