`

使用反射读取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  
不错,可以使用

相关推荐

    Visual Basic.net 反射参考手册.rar

    7. **自定义属性**:VB.NET中的自定义属性提供了元数据信息,反射可以用于读取这些信息,帮助程序在运行时了解对象的附加信息。 8. **安全性考虑**:虽然反射提供了极大的灵活性,但使用不当也可能引入安全风险,...

    c# 反射实例

    在C#编程中,反射被广泛用于元数据的获取、动态类型创建、方法调用以及属性和字段的访问等场景。下面我们将深入探讨C#反射的相关知识点。 一、类型信息获取 1. 获取Type对象:`typeof`关键字用于获取已知类型的`...

    深入浅出Java注解(注解概述+注解的本质+反射注解信息+元注解+属性的数据类型及特别的属性:value和数组)

    注解的属性可以是基本数据类型、String、Class、Enum、Annotation 等。我们可以使用 `@MyAnnotation(getValue = "annotation on class")` 这样的方式来给注解赋值。 特别的属性:value 和数组 注解的属性可以是...

    C# 反射机制

    - **访问属性和字段**:即使在编码时无法直接访问,反射也能让我们读取和修改对象的私有属性和字段。 - **元数据获取**:获取类型、接口、构造函数等的详细信息,如继承关系、实现的接口、方法签名等。 - **序列...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    PropertyGrid中的枚举显示为中文

    在枚举中,我们可以为每个枚举项添加`DescriptionAttribute`,然后在`PropertyGrid`中通过反射读取这些描述,以中文形式展示。以下是一个简单的示例: ```csharp public enum Color { [Description("红色")] Red,...

    Java中的reflect 反射的基本东西,

    Java中的反射机制是Java语言提供的一种强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。反射在许多高级编程任务中扮演着关键角色,比如动态加载类、创建对象、访问私有成员、调用...

    java反射学习资料

    Java反射的核心在于`java.lang.Class`类,它代表了类的信息,通过反射可以获取到类的所有属性、方法、构造器等。例如,以下代码展示了如何使用反射判断一个对象所属的类: ```java A a = new A(); if (a.getClass()...

    java基础反射IO流线程模式

    反射可以用来访问对象的私有属性。 #### 调用对象的方法 反射还可以用来调用对象的私有方法。 #### 数组的反射 `java.lang.reflect.Array`类提供了处理数组的方法。 ### 线程 Java的多线程模型基于线程类`...

    ReflectionDemo.rar

    反射还可以帮助处理枚举,通过`Enum.GetNames()`和`Enum.GetValues()`获取枚举的名称和值数组。 6. **泛型类型**: 反射也能处理泛型类型,`MakeGenericType()`方法允许我们创建指定类型的实例,甚至可以传入参数...

    注解+反射实现自定义验证工具,可实现业务校验,字段多种校验

    验证工具类需要能够读取到类上的注解信息,并根据这些信息执行相应的验证逻辑。具体来说,包括以下几个方面: - **枚举定义**:定义枚举`VerifyWay`,用于表示不同的验证策略,比如`GreaterThan`、`LessThan`、`...

    QtQMetaProperty.7z

    在实际开发中,`QMetaProperty`常用于动态构建UI、反射机制、序列化/反序列化、以及自定义的属性系统。例如,当你需要根据数据模型动态生成界面元素时,可以通过`QMetaProperty`获取模型中每个字段的信息,然后创建...

    Attribute标记属性_资料收集

    Attribute标记属性在.NET框架中扮演着重要的角色,它是元数据的一部分,允许我们在代码中附加信息,这些信息在程序运行时可以被编译器、运行时或其他工具读取和使用。Attribute提供了一种灵活的方式来注解类、方法、...

    【java元注解】相关资源

    `RetentionPolicy.RUNTIME`则表明注解在运行时仍可被JVM读取,通常用于运行时反射。 3. **@Documented**: `@Documented`元注解指示Javadoc等文档工具应将注解包含在生成的文档中,使其成为公共API的一部分。这...

    498.496.JAVA基础教程_枚举类与注解-枚举类的理解(498).rar

    然后在方法上使用这个注解,并在运行时通过反射获取并处理这个注解的信息。 枚举类和注解结合使用可以实现更高级的功能。例如,使用枚举表示不同的日志级别,然后通过注解标记需要根据日志级别的方法: ```java ...

    java单例模式.doc.doc

    在读取配置文件等场景下,使用单例模式可以有效地管理配置对象,确保数据一致性并节约系统资源。通过多种实现方式,如饿汉式、懒汉式、静态内部类和枚举单例,可以根据需求选择最适合的实现策略。

    java加强笔记

    - 可以使用`@interface`关键字定义注解,然后使用反射来读取注解信息。 ##### 3. 为注解增加各种属性 - 注解可以包含各种属性,如字符串、数字、其他注解等。 #### 七、Java5的泛型 ##### 1. 泛型的基本应用 - ...

    jdk1.5后的特性.rar

    - **反射与注解**:使用反射 API,可以读取类、方法、字段上的注解,从而实现动态处理。 以上是对 JDK 1.5 及其后续版本中泛型、枚举和注解的简要介绍。这些特性不仅提高了代码的健壮性,还简化了开发流程,使 Java...

    C#特性Attribute的实际应用之:为应用程序提供多个版本

    这些信息可以在运行时被反射机制读取,从而实现各种功能。在标题“C#特性Attribute的实际应用之:为应用程序提供多个版本”中,我们可以看到一个具体的应用场景,即利用特性来区分和管理应用程序的不同版本,如体验...

Global site tag (gtag.js) - Google Analytics