package com.baidu.disconf.client.support.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baidu.disconf.client.common.annotations.DisconfFileItem;
import com.baidu.disconf.client.common.annotations.DisconfItem;
import com.baidu.disconf.core.common.constants.DisConfigTypeEnum;
/**
* @author liaoqiqi
* @version 2014-9-9
*/
public class MethodUtils {
protected static final Logger LOGGER = LoggerFactory.getLogger(MethodUtils.class);
/**
* 对于一个 get/is 方法,返回其相对应的Field
*/
public static Field getFieldFromMethod(Method method, Field[] expectedFields, DisConfigTypeEnum disConfigTypeEnum) {
String fieldName;
if (disConfigTypeEnum.equals(DisConfigTypeEnum.FILE)) {
DisconfFileItem disconfFileItem = method.getAnnotation(DisconfFileItem.class);
// 根据用户设定的注解来获取
fieldName = disconfFileItem.associateField();
} else {
DisconfItem disItem = method.getAnnotation(DisconfItem.class);
// 根据用户设定的注解来获取
fieldName = disItem.associateField();
}
//
// 如果用户未设定注解,则猜其名字
//
if (StringUtils.isEmpty(fieldName)) {
// 从方法名 获取其 Field 名
fieldName = ClassUtils.getFieldNameByGetMethodName(method.getName());
}
// 确认此Field名是正确的
for (Field field : expectedFields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
LOGGER.error(method.toString() + " cannot get its related field name. ");
return null;
}
/**
*
*/
public static Method getSetterMethodFromField(Class<?> curClass, Field field) {
String fieldName = field.getName().toLowerCase();
Set<Method> methods = ClassUtils.getAllMethod(curClass);
for (Method method : methods) {
if (method.getName().toLowerCase().equals("set" + fieldName)) {
return method;
}
}
return null;
}
}