使用反射读取enum的属性

本文介绍了如何将枚举类型转换为Map并进一步转化为JSON串,用于前端页面展示。通过示例代码展示了枚举类型的特性及如何利用反射机制来简化枚举处理过程。
使用到的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语句中使用。


http://java-xp.iteye.com/blog/1678135

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值