java反射之获取枚举对象
项目中导入大量枚举对象,用来定义常量。随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求。
public enum ExamType {
CRAFT(1, "草稿"),
PASSING(2, "待审核");
private int value;
private String typeName; ExamType(int value, String typeName) {
this.value = value;
this.typeName = typeName;
}
//通过value获取对应的枚举对象
public static ExamType getExamType(int value) {
for (ExamType examType : ExamType.values()) {
if (value == examType.getValue()) {
return examType;
}
}
return null;
} }
随着项目的增大,可能存在很多枚举对象都需要,可能都需要去实现一样的方式,就存在了代码冗余的问题,可惜enum对象又不不能继承其他类
(默认继承Enum)。所以考虑说使用反射来替代之前的方式
为了方便,将代码写带一个类中
//接口类
public interface EnumMessage {
Integer getValue();
String getMessage();
} //枚举类
public enum AccountStatus implements EnumMessage {
Init(0,"初始化"),
Ready(1,"正常"),
ChangePassword(2,"需要修改密码"),
Frozen(4,"冻结"),
Disabled(64,"禁用"),
;
private final Integer _code;
private final String _message;
AccountStatus(Integer code,String message){
_code=code;
_message=message;
}
@Override
public Integer getValue() { return _code;}
@Override
public String getMessage() { return _message; }
} public enum AuditNotifyStatus implements EnumMessage {
Sms(2,"短信"),
Mail(4,"邮箱"),
SmsAndMail(6,"短信和邮箱"),
;
private final Integer _code;
private final String _message;
AuditNotifyStatus(Integer code,String message){
_code=code;
_message=message;
}
@Override
public Integer getValue() { return _code;}
@Override
public String getMessage() { return _message; }
}
常量类
public class Constant { /**
* 枚举类对应的包路径
*/
public final static String PACKAGE_NAME = "com.lwx.util.reflex.enums";
/**
* 枚举接口类全路径
*/
public final static String ENUM_MESSAGE_PATH=PACKAGE_NAME+".EnumMessage"; /**
* 枚举类对应的全路径集合
*/
public static final List<String> ENUM_OBJECT_PATH = PackageUtil.getPackageClasses(PACKAGE_NAME, true); /**
* 存放单个枚举对象 map常量定义
*/
private static Map<Integer, EnumMessage> SINGLE_ENUM_MAP = null;
/**
* 所有枚举对象的 map
*/
public static final Map<Class, Map<Integer, EnumMessage>> ENUM_MAP = initialEnumMap(true); /**静态初始化块*/
static { } /**
* 加载所有枚举对象数据
* @param isFouceCheck 是否强制校验枚举是否实现了EnumMessage接口
*
* */
private static Map<Class, Map<Integer, EnumMessage>> initialEnumMap(boolean isFouceCheck){
Map<Class, Map<Integer, EnumMessage>> ENUM_MAP = new HashMap<Class, Map<Integer, EnumMessage>>();
try {
for (String classname : ENUM_OBJECT_PATH) {
Class<?> cls = null;
cls = Class.forName(classname);
Class <?>[]iter=cls.getInterfaces();
boolean flag=false;
if(isFouceCheck){
for(Class cz:iter){
if(cz.getName().equals(ENUM_MESSAGE_PATH)){
flag=true;
break;
}
}
}
if(flag==isFouceCheck){
SINGLE_ENUM_MAP = new HashMap<Integer, EnumMessage>();
initialSingleEnumMap(cls);
ENUM_MAP.put(cls, SINGLE_ENUM_MAP);
} }
} catch (Exception e) { }
return ENUM_MAP;
} /**
* 加载每个枚举对象数据
* */
private static void initialSingleEnumMap(Class<?> cls )throws Exception{
Method method = cls.getMethod("values");
EnumMessage inter[] = (EnumMessage[]) method.invoke(null, null);
for (EnumMessage enumMessage : inter) {
SINGLE_ENUM_MAP.put(enumMessage.getValue(), enumMessage);
}
} }
工具包类
public class PackageUtil { /**
* 返回包下所有的类
* @param packagePath 包名
* @return List<String> 包下所有的类
* */
public static List<String> getPackageClasses(String packagePath){ return getPackageClasses(packagePath,false);
}
/**
* 返回包下所有的类
* @param packagePath 包名全路径
* @param classWithPath 返回全路径开关 true 自动带上包名
* @return List<String> 包下所有的类
* */
public static List<String> getPackageClasses(String packagePath,boolean classWithPath){ List<String> classNames = getClassName(packagePath);
List<String>result =new ArrayList<String>(classNames.size());
String path =classWithPath?packagePath+".":"";
for (String className : classNames) {
result.add(path+className.substring(className.lastIndexOf(".")+1));
}
return result;
} private static List<String> getClassName(String packageName) {
String filePath = ClassLoader.getSystemResource("").getPath() + packageName.replace(".", "\\");
List<String> fileNames = getClassName(filePath, null);
return fileNames;
} private static List<String> getClassName(String filePath, List<String> className) {
List<String> myClassName = new ArrayList<String>();
File file = new File(filePath);
File[] childFiles = file.listFiles();
for (File childFile : childFiles) {
if (childFile.isDirectory()) {
myClassName.addAll(getClassName(childFile.getPath(), myClassName));
} else {
String childFilePath = childFile.getPath();
childFilePath = childFilePath.substring(childFilePath.indexOf("\\classes") + 9, childFilePath.lastIndexOf("."));
childFilePath = childFilePath.replace("\\", ".");
myClassName.add(childFilePath);
}
} return myClassName;
} }
核心的获取枚举对象的类
public class EnumUtil { /**
* 获取value返回枚举对象
* @param value
* @param clazz
* */
public static <T extends EnumMessage> T getEnumObject(int value,Class<T> clazz){
return (T)Constant.ENUM_MAP.get(clazz).get(value);
} }
测试
public static void main(String[] args) { System.out.println(EnumUtil.getEnumObject(2, AuditNotifyStatus.class).getMessage());;//短信
System.out.println(EnumUtil.getEnumObject(6, AuditNotifyStatus.class).getMessage());;//短信和邮箱 }
拓展与参考
1.获取变量的值
public class Test {
public static void main(String[] args) {
//构造对象
User user = new User();
String strs[] ={"1","2","3"};
user.setStrs(strs); Method[] methods = user.getClass().getMethods();
for(Method m:methods){
String methodNames= m.getName();
if(methodNames.equals("getStrs")){
try {
Object obj =m.invoke(user, new Object[]{});
if(obj instanceof java.lang.String []){
String tempstrs [] =(String[]) obj;
for(String str:tempstrs){
System.out.println(str);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
class User{
private String strs[]; public String[] getStrs() {
return strs;
} public void setStrs(String[] strs) {
this.strs = strs;
}
}
2.关于枚举的介绍(枚举无法通过newInstance来进行实力,本身构造就不能public,其实也就是规范)
http://whitesock.iteye.com/blog/728934
3.java反射获取注解
http://blog.csdn.net/lufeng20/article/details/8835135
http://blog.csdn.net/liyangbing315/article/details/5181381
4.使用反射+注解完成库表设计
http://blog.csdn.net/lufeng20/article/details/8730604
5.enum的使用,包含enumMap/enumSet
http://wenku.baidu.com/link?url=1y8U2qovo-oJkRmUBR_7sXkivFLxExzCW0J6hunDVcfIij08MX4RS45_eLptBGrujzS3q4tiGwsF4PmoGx032RBWj1IMmzOn6693B2YBVe_
java反射之获取枚举对象的更多相关文章
- java 根据值获取枚举对象
关键方法: /** * 值映射为枚举 * * @param enumClass 枚举类 * @param value 枚举值 * @param method 取值方法 * @param <E&g ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- java 反射之获取泛型对象的所有字段与对应的值(包括父类的)
上代码: public static void main(String[] args) throws IntrospectionException { SysUser obj = new SysUse ...
- 第三章 EnumUtil根据值获取枚举对象
项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- java根据url获取json对象
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...
- Java 反射 分析类和对象
Java 反射 分析类和对象 @author ixenos 摘要:优化程序启动策略.在运行时使用反射分析类的结构和对象 优化程序启动策略 在启动时,包含main方法的类被加载.它会加载所有它需要的类. ...
- java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘
java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...
- .NET(C#):使用反射来获取枚举的名称、值和特性【转】
首先需要从内部了解一下枚举(Enumeration),相信许多人已经知道了,当我们声明一个这样的枚举类型: enumMyEnum { AAA, BBB, CCC } 背后的IL是这样的: .class ...
随机推荐
- OpenGL ES 3.0(五)
使用EGL(在iOS中是EAGL)创建屏幕渲染 加载顶点和片段着色器 创建程序对象,连接顶点和片段着色器,连接程序对象 设置视口 清除颜色缓冲区 绘制一个简单的图元(三角形) 显示缓冲区内容 1.创建 ...
- C#.NET常见问题(FAQ)-如何不显示窗口的关闭按钮
如果把ControlBox设置为false,则右上角三个按钮都看不到了 最好的方法是重写窗体的CreateParams方法,如下图所示 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间 ...
- mysql 分区说明
当 MySQL的总记录数超过了100万后,性能会大幅下降,可以采用分区方案 分区允许根据指定的规则,跨文件系统分配单个表的多个部分.表的不同部分在不同的位置被存储为单独的表. 1.先看下innodb的 ...
- 微信小程序 - ios不能播放背景音乐
由以下原因导致的 1. 未设置标题(backgroundPlayer.title)或标题为空 2. url只能英文,不能出现空格以及其它字符(中文.韩文.日文等)- iOS要求英文路径
- 定制保存top输出信息的格式详解
top命令的重要性和使用方法不多说了,这里终点讨论如何保存top命令的输出信息. 保存top命令的输出到一个文件的方法是:top -n1b > topinfo.txt,这没什么好奇的,但 ...
- Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)
1.问题描写叙述 写一个高效的算法.从一个m×n的整数矩阵中查找出给定的值,矩阵具有例如以下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 依据矩阵的特征非常 ...
- django之创建第3个项目:编写第一个模板文件
1.django结构 2.在站点blog下创建templates文件夹,专门用于存放模板文件 3.在templates文件夹下创建index.html文件 #index.html <!DOCTY ...
- python之模块pprint之常见用法
# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块pprint之常见用法 import pprint data = [(1,{'a':'A' ...
- 10个超棒jQuery表单操作代码片段
jQuery绝对是一个伟大的开源javascript类库,是帮助我们快速和高效开发前端应用的利器.可能大家在日常的开发过程中常常会处理表单相关的javascript,在今天这篇代码片段分享文章中,这里 ...
- 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述
读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...