欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用反射读取enum的属性

程序员文章站 2022-06-09 09:07:00
...
使用到的Enum如下:
public enum Colour{
    RED(113001, "红色"),
    BLUE(113002, "蓝色");
    private int code;
    private String name;

    Colour(int code,String name){
         this.code= code;
         this.name= name;
    }
    public String toName() {
        return this.name == null ? this.name() : this.name;
    }
    public int toCode() {
        return this.code == null ? this.ordinal() : this.code;
    }
}
页面显示的时候会使用到下拉框,这样就需要把枚举的name和code遍历到一个map中,再转后为json串,供前台页面使用。使用下面的方式和容易实现这一点:
    public static Map<Integer, String> toCodeDescriptionMap() {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
        for (int i = 0; i < Colour.values().length; i++) {
            map.put(Colour.values()[i].toCode(), Colour.values()[i].toDescription());
        }
        return map;
    }
由于使用到类似的枚举类型还有很多,这样的话就需要在每个枚举里面添加同样的代码。所以考虑提供一个公用的方法,传入枚举类型,就能转换出一个map。代码如下:
public static Map<Integer, String> toCodeDescriptionMap(Enum em) {
        Class clazz = em.getDeclaringClass();
        LinkedHashMap<Integer, String> map = new LinkedHashMap<String, String>();
        try {
            Method toName = clazz.getMethod("toName");
            Method toCode = clazz.getMethod("toCode");
            //得到enum的所有实例
            Object[] objs = clazz.getEnumConstants();
            for (Object obj : objs) {
                map.put((Integer)toCode.invoke(obj),(String)toName.invoke(obj));
            }
            return map
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
调用的方式:
    toCodeDescriptionMap(Colour.RED);


Enum类的一些特点:
1、Color枚举类就是class,而且是一个不可以被继承的final类。枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。
2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同: 
    (1) 构造器只是在构造枚举值的时候被调用。
    (2) 构造器只能私有private,绝对不允许有public构造器。
    (3) 枚举值必须要类的最前面。
3、所有枚举类都继承了Enum的方法,具有这些方法。 
       (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
                 Color.RED.ordinal();  //返回结果:0
                 Color.BLUE.ordinal();  //返回结果:1
       (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺 序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                 Color.RED.compareTo(Color.BLUE);  //返回结果 -1
       (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+",");
                 }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
       (4)  toString()方法: 返回枚举常量的名称。
                 Color c=Color.RED;
                 System.out.println(c);//返回结果: RED
       (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                 Color.valueOf("BLUE");   //返回结果: Color.BLUE
       (6)  equals()方法: 比较两个枚举类对象的引用。
4、枚举类可以在switch语句中使用。