使用自定义注解把一个对象的属性转化成对应的枚举集合
枚举
public interface BaseEnum<T> {
T getCode();
}
public enum AttrEnum implements BaseEnum<Integer>{
enum10(10),enum20(20);
private Integer code;
AttrEnum(int i) {
this.code = i;
}
@Override
public Integer getCode() {
// TODO Auto-generated method stub
return code;
}
public static AttrEnum getByCode(Integer code) {
for(AttrEnum _enum:AttrEnum.values()) {
if(code==_enum.getCode()) {
return _enum;
}
}
return null;
}
}
自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldCovertEnumAnnotation {
int enumCode();
String enumName();
}
对象
public class EnumInfo {
@FieldCovertEnumAnnotation(enumCode=10,enumName="AttrEnum")
private Integer attr1;
@FieldCovertEnumAnnotation(enumCode=20,enumName="AttrEnum")
private Integer attr2;
private Integer attr3;
public EnumInfo(Integer attr1, Integer attr2) {
super();
this.attr1 = attr1;
this.attr2 = attr2;
}
}
属性转枚举集合方式
public static void main(String[] args) throws Exception{
EnumInfo info = new EnumInfo(1,2);
Map<AttrEnum,Integer> enumMaps = getEnums(AttrEnum.class,info);
System.out.println(enumMaps);
}
public static <T extends BaseEnum> Map<T,Integer> getEnums(Class<T> cls,EnumInfo info) throws Exception{
Map<T,Integer> enumMaps =new HashMap<T,Integer>();
for(Field field:info.getClass().getDeclaredFields()) {
if(field.isAnnotationPresent(FieldCovertEnumAnnotation.class)) {
FieldCovertEnumAnnotation annotation = field.getAnnotation(FieldCovertEnumAnnotation.class);
Integer code = annotation.enumCode();
Method method = cls.getMethod("getByCode",Integer.class);
T _enum = (T)method.invoke(null,code);
field.setAccessible(true);
Integer value = (Integer)field.get(info);
enumMaps.put(_enum,value);
}
}
return enumMaps;
}
执行结果
{enum10=1, enum20=2}