java枚举取值没有取到对应的name_java Enum 枚举帮助类,根据值或者名称获取枚举类型对象...

讲真,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 indexOf(Class clazz, int ordinal){

return (T) clazz.getEnumConstants()[ordinal];

}

/**

* nameOf,传入的参数name指的是枚举值的名称,一般是大写加下划线的

* T

* @param clazz

* @param name

* @return Enum T

* @author xiehao

*/

public static > T nameOf(Class 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 getByStringTypeCode(Class 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 getByIntegerTypeCode(Class 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 getByStringTypeName(Class 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;

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值