`

使用反射读取enum的属性

    博客分类:
  • java
阅读更多
使用到的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语句中使用。
分享到:
评论
2 楼 di1984HIT 2017-06-16  
学习了~~~
1 楼 houzhanshanlinzhou 2016-08-22  
不错,可以使用

相关推荐

Global site tag (gtag.js) - Google Analytics