java反射扫描包,获取枚举属性

引言

由于现在正在接触的项目是前后端分离,我们自己定义了一些实体类的状态码(意思就是前后台传输成功、失败、或者别的信息,都是用具体的数字代表,有点像 HTTP状态码),由于这些东西前台写一份后台写一份会导致后期维护起来麻烦,所以就设置页面登录的时候发一个cookie,里面包含响应码的信息。

正文

想多写文字解释这个程序,想来想去还是放到代码里面吧。我个人平时也不是很喜欢看文字,看代码更高效一点感觉。

/**
     * 扫描制定目录下所有的.class文件,得到全路径名
     * @param basePack 为.java的路径
     * @return
     * @throws ClassNotFoundException
     */
    private static List<String> searchClass(String basePack) throws ClassNotFoundException
    {
        List<String> classPaths = new ArrayList<String>();
        // 包名转换为路径,首先得到项目的classpath
        String projectClasspath = ConstsUtils.class.getResource("/").getPath();
        // 包名basPach转换为路径名
        basePack = basePack.replace(".", File.separator);
        // 合并classpath和basePack
        String searchPath = projectClasspath + basePack;
        doPath(projectClasspath, new File(searchPath), classPaths);

        return classPaths;
    }

    /**
     * 该方法会得到所有的类,将类的绝对路径写入到classPaths中
     * @param file
     */
    private static void doPath(String projectClasspath, File file, List<String> classPaths)
    {
        if (file.isDirectory())
        {// 文件夹
         // 文件夹就递归
            File[] files = file.listFiles();
            for (File fileTemp : files)
            {
                doPath(projectClasspath, fileTemp, classPaths);
            }
        }
        else
        {// 标准文件
         // 标准文件判断是否是class文件
            if (file.getName().endsWith(".class"))
            {
                // 如果是class文件的绝对路径转换为全类名放入集合中。
                classPaths
                        .add(file.getPath().replace(projectClasspath.replace("/", "\\").replaceFirst("\\\\", ""), "").replace("\\", ".").replace(".class", ""));
            }
        }
    }
根据下面两个方法,就可以将制定包下文件的全路径名,加载到集合中。具体思想就是,拿到项目运行的classpath然后拼接到传入的basePack查找此目录下所有类已经加载的class文件,然后根据文件得到路径添加到集合中返回。


下面这个代码是根据类的全路径,反射枚举类中定义的属性的值。详细内容注释比较全面
package com.huihui.consts.orders;

public enum OrderStatus
{
	DAIFU((short)1, "待付款"),
	YIFU((short)2, "已付款"),
	WEIFA((short)3, "未发货"),
	YIFA((short)4, "已发货"),
	SUCCESS((short)5, "交易成功"),
	CANCEL((short)6, "交易取消"),
	SUCCESS_SHOP_CHANGE((short)7, "交易成功-店铺变更"),
	CANCEL_SHOP_CHANGE((short)8, "交易取消-店铺变更");
	
	private short code;

	private String name;

	private OrderStatus(short code, String name)
	{
		this.code = code;
		this.name = name;
	}

	public short getCode()
	{
		return this.code;
	}

	public String getName()
	{
		return this.name;
	}
}

/**
     * 通过类的全路径名反射得到已经定义的属性的值
     * @param totalConsts 返回的map
     * @param searchClass 类的全路径名的集合
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    private static void classPathsByData(Map<String,Object> totalConsts,List<String> searchClass)
            throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        Map<String, Object> map = null;
        ConstsUtils consts = null;
        // 循环每一个路径
        for (String className : searchClass)
        {
            // 得到Class对象,通过forName会执行static语句,枚举定义中的变量会自动加载
            Class<?> forName = Class.forName(className);
            // 得到方法名的集合
            Method[] methods = forName.getDeclaredMethods();
            if (forName.isEnum())
            {// 是枚举类
                map = new HashMap<>();
                consts = new ConstsUtils();
                // 返回枚举类中所有的元素
                List<?> list = Arrays.asList(forName.getEnumConstants());
                // 依次迭代
                for (Object enu : list)
                {
                    ConstsUtils.Status status = consts.new Status();
                    for (Method method : methods)
                    {
                        if (method.getName().startsWith("getName"))
                        {
                            status.setName((String) method.invoke(enu));
                        }
                        if (method.getName().startsWith("getCode"))
                        {
                            status.setCode((Short) method.invoke(enu));
                        }
                    }
                    map.put(enu.toString(), status);
                }
                // 通过全路径名切割字符串变成类名
                totalConsts.put(className.substring(className.lastIndexOf(".") + 1,className.length()),map);
            }
        }
    }



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值