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 ...
随机推荐
- 浮动闭合最佳方案:clearfix
之前给大家介绍两种浮动闭合的办法CSS清除浮动 万能float闭合,得知很多同学都在使用下面的骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} ...
- IntelliJ - idea15.0.2 破解方法
由于idea 15版本更换了注册方式,只能通过联网激活,所以现在不能通过简单的通用注册码进行离线注册了, 虽然可以继续用14版本,但是有新版本却无法尝试让强迫症也是异常抓狂. 通过度娘我找到了一个破解 ...
- 【树形DP】 HDU 2412 Party at Hali-Bula
给出根节点(BOSS) 然后还有N-1个边 A B 由B指向A (B为A 的上司) 每次仅仅能选择这个关系中的当中一个 求最多选几个点 而且输出是不是唯一的 重点推断是否唯一: 1.若下属不去和去都 ...
- common.js 2017
String.IsNullOrEmpty = function (v) { return !(typeof (v) === "string" && v.length ...
- Mysql删除所有表
SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_s ...
- Sqlite执行insert or ignore 或insert or replace语句。
Sqlite执行insert or ignore 或insert or replace语句. ,); ,); 上面的第一条语句是每次执行时,如果不存在,则添加,如果存在,则更新. 上面的第二条语句是每 ...
- 通过httpclient3实现文件下载以及获取文件下载名称
package httpclient3test; import java.io.File; import java.io.FileNotFoundException; import java.io.F ...
- mac pro 显示隐藏文件
经常希望在IOS操作系统现实隐藏文件,下面两条语句可以使用: 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:de ...
- 这两天使用JSP开发程序,记录一些基本方法
一.截取字符串 第一步 导入包:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn ...
- python获取命令行参数 启动文件
import sys # python D:\MARK\temp.py m1 start 9090 print(sys.argv) # ['D:\\MARK\\temp.py', 'm1', 'sta ...