`
wsxhbusbanana
  • 浏览: 32496 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java Enum 枚举帮助类,根据值或者名称获取枚举类型对象

    博客分类:
  • j2EE
阅读更多

    讲真,java的枚举类提供的方法太少了,Enum只有两个valueOf可以搞,如果碰上需要传入枚举类型的值,获取枚举类对象或者枚举类型名称的时候,只能干瞪眼,或者循环比对。最近项目就遇到这种,而且感觉以后以及别人都不会少遇到,所以就写了个帮助类,希望以后能用上吧。这个帮助类是基于以下枚举类的类型提供的:

 

 

public enum DeleteStatusEnum {
	/**
	 * 值为0(就是NOT_DELETE)是数据库默认值,未删除;
	 * 值为1(就是HAS_DELETE)是已经被逻辑删除了
	 */
	NOT_DELETE("未删除","0"),
	HAS_DELETE("已删除","1");
	
	private String typeName;
	private String typeCode;
	
	private DeleteStatusEnum(String typeName,String typeCode){
		this.typeName = typeName;
		this.typeCode = typeCode;
	}

	public String getTypeName() {
		return typeName;
	}

	public void setTypeName(String typeName) {
		this.typeName = typeName;
	}

	public String getTypeCode() {
		return typeCode;
	}

	public void setTypeCode(String typeCode) {
		this.typeCode = typeCode;
	}
}

 帮助类的内容:

package com.hikvision.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * 此帮助类严格限定为有typeName和typeCode的枚举类,如定义枚举类型为 ADMIN(typeName,typeCode)这种
 * 
 * ClassName: EnumOperatorUtil.java 
 * Copyright xiehao 
 * Function: TODO ADD FUNCTION.
 * Reason: TODO ADD REASON.
 * Date:   2017年2月28日
 * @author   xiehao 
 * @version  V1.0
 * @since    JDK 1.8
 * @see
 */
public class EnumHelperUtil{
	/**
	 * indexOf,传入的参数ordinal指的是需要的枚举值在设定的枚举类中的顺序,以0开始
	 * T
	 * @param clazz
	 * @param ordinal
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T indexOf(Class<T> clazz, int ordinal){
		return (T) clazz.getEnumConstants()[ordinal];
	}
	/**
	 * nameOf,传入的参数name指的是枚举值的名称,一般是大写加下划线的
	 * T
	 * @param clazz
	 * @param name
	 * @return Enum T
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T nameOf(Class<T> clazz, String name){
		
		return (T) Enum.valueOf(clazz, name);
	}
	/**
	 * 使用枚举类型对应的typeCode获取枚举类型
	 * T
	 * @param clazz    枚举类的class
	 * @param getTypeCodeMethodName  传入的typeCode的get方法
	 * @param typeCode  传入的typeCode值,这个方法为String类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByStringTypeCode(Class<T> clazz,String getTypeCodeMethodName, String typeCode){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeCodeMethodName);
			String typeCodeVal = null;
			for(T entity:arr){
				typeCodeVal = targetMethod.invoke(entity).toString();
				if(typeCodeVal.contentEquals(typeCode)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 使用枚举类型对应的typeCode获取枚举类型
	 * T
	 * @param clazz    枚举类的class
	 * @param getTypeCodeMethodName  传入的typeCode的get方法
	 * @param typeCode  传入的typeCode值,这个方法为Integer类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByIntegerTypeCode(Class<T> clazz,String getTypeCodeMethodName, Integer typeCode){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeCodeMethodName);
			Integer typeCodeVal = null;
			for(T entity:arr){
				typeCodeVal = Integer.valueOf(targetMethod.invoke(entity).toString());
				if(typeCodeVal.equals(typeCode)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}
	/**
	 * 使用枚举类型对应的typeName获取枚举类型
	 * T
	 * @param clazz   枚举类的class 
	 * @param getTypeNameMethodName  传入的typeName的get方法
	 * @param typeName 传入的typeName值,这个方法为String类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByStringTypeName(Class<T> clazz,String getTypeNameMethodName, String typeName){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeNameMethodName);
			String typeNameVal = null;
			for(T entity:arr){
				typeNameVal = targetMethod.invoke(entity).toString();
				if(typeNameVal.contentEquals(typeName)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}
}

 以上内容其实还可以再精简优化,时间有限,就先记录下来吧

分享到:
评论

相关推荐

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season {  SPRING, SUMMER, AUTUMN, WINTER  }  定义了一个季节枚举类型。  在本例中,对于Season.SPRING这个...

    enum枚举类的应用

    包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。

    解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类

    解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类 ZipInputStream实现压缩文件的读取与数据转化的过程,利用反射实现根据枚举值获取枚举对象。

    genum:从YAML生成Java枚举类

    Genum是从YAML数组生成Java枚举类文件的代码生成器。 您可以在服务器端和客户端应用程序之间共享定义! 例如,这是一个以YAML格式编写的数组。 - Tokyo - NewYork - London - Beijing - Paris - Roma Genum将其...

    java实现高效的枚举元素集合示例

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。...

    用enum实现单例模式的方法来读取配置文件

    NULL 博文链接:https://java--hhf.iteye.com/blog/2171034

    Java期末复习——枚举与反射机制

    Java——枚举: enum关键字、Enum类 类集对枚举的支持——EnumMap类与EnumSet类 枚举类实现接口、在枚举类中定义抽象方法 Java反射机制: Class类、Class类的使用 反射的应用:取得类的结构

    Java工作笔记-枚举类型反射

    这里枚举类型有自己的反射方式: 这里我先总结下逻辑: 1. 通过getEnumConstatnts返回目前枚举中存在的对象。 2. 通过getMehod获取方法。 3. 最后用这个对象调用其方法。 程序运行截图如下: 其中对应的枚举: ...

    iOS开发之枚举用法小结

    Enum,也就是枚举,从C语言开始就有了,C++、Java、Objective-C、Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态、选项等“常量”。 举个例子,我们想要在...

    Java实现高效的枚举元素集合

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。...

    【05-面向对象(下)】

    •如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的XxxValue()实例方法。 自动装箱与自动拆箱 •JDk还提供了自动装箱和自动拆箱。自动装箱就是把一个基本类型的变量直接赋给对应的...

    Java开发技术大全 电子版

    9.6.5根据方法的名称来执行方法299 9.6.6创建新的对象300 9.6.7改变属性的值301 9.6.8使用数组301 9.7本章小结303 第10章泛型304 10.1泛型的本质304 10.2一个关于泛型的简单例子305 10.3带两个类型参数的...

    enumerables:具有代表“未知”值的能力的Java枚举,非常适合稳定的API

    可枚举可枚举与标准Java Enum类型相似,但具有解析“尚不知道”值的附加功能。 如果您尝试构建稳定的API,它们将无价之宝。获取图书馆将以下依赖项添加到您的项目中,或 下载。 &lt; dependency&gt; &lt; groupId&gt;nl....

    FilePath.java

    使用java中的枚举类型制作字符串常量,使用指定的key获取指定的枚举值。

    Java学习路线:day22

    文章目录第10章枚举类与注解枚举类的使用枚举类的理解自定义枚举类使用enum关键字定义枚举类Enum类中的常用方法使用enum关键字定义的枚举类实现接口注解的使用注解的理解Annotation的使用示例如何自定义注解jdk中4个...

    day021-反射和注解笔记和代码.rar

    7. TYPE:可以在类、接口(包括注解类型) 或enum上使用注解 例如:@Target(ElementType.METHOD)//意味着@Override只能在普通方法上使用 public @interface Override { } ...

    GenericEnum:从字符串,整数或参数中检索枚举名称

    通用枚举从字符串,整数或参数中检索枚举名称此... 即使枚举值没有参数且使用字符串,您也可以获取最后一次更新。 另外,我已经将项目更新为包含软件包。 有关示例,请参见com.kv.genericenum.test.MyMainClass.java。

    day020-继承加强和设计模式代码和笔记.rar

    优点:在类加载的时候,就创建好对象放到静态区了,获取对象效率高。线程安全 缺点:类加载效率低,并且static修饰的成员占用资源。 2. 懒汉模式:懒加载模式 (优化方式:双重校验锁) 优点...

    在一小时内学会 C#(txt版本)

    如果熟悉 Java 语言,Java 的编程结构、打包和垃圾回收的概念肯定对你快速学习 C# 大有帮助。所以我在讨论 C# 语言构造的时候会假设你知道 C++。 本文通过一系列例程以简短但全面的方式讨论了 C# 语言构造和特性,...

Global site tag (gtag.js) - Google Analytics