使用反射读取enum的属性
程序员文章站
2022-06-09 09:04:59
...
使用到的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语句中使用。
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语句中使用。