首页 > 编程语言 >java获取包下所有的类

java获取包下所有的类

时间:2023-04-19 11:47:31浏览次数:36  
标签:java String 所有 List basePackageName 获取 dirPath return

1.背景

给一个Java的包名,获取包名下的所有类..

根据类上的注解,可以展开很多统一操作的业务

2.直接看代码

package com.common.config.mq.supplier;

import com.common.config.mq.MqRegister;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLDecoder;
import java.util.*;

/**
 * @Copyright (C) XXXXX技有限公司
 * @Author: ldp
 * @Date: 2023/4/19 10:41
 * @Description:
 */
@Slf4j
public class MqSupplierConstHelp {

    /**
     * 获取当前包路径下的队列
     *
     * @return
     * @throws Exception
     */
    public Set<String> getSupplierQueueList() throws Exception {
        String basePackageName = this.getClass().getPackage().getName();
        log.info("basePackageName=" + basePackageName);
        // 获取包的磁盘路径
        String dirPath = getDirPath(basePackageName);
        // 获取磁盘路径下的Java对象
        List<String> classNameList = getClassNameList(dirPath);
        log.info("classNameList" + classNameList);
        // 获取到class字节码集合
        List<Class<?>> classList = getClassList(classNameList, basePackageName);
        // 获取到带有注解的字段值
        Set<String> fieldQueueNameList = getFieldQueueName(classList);
        return fieldQueueNameList;
    }

    /**
     * 根据包名获取磁盘路径
     *
     * @param basePackageName
     * @return
     * @throws Exception
     */
    private String getDirPath(String basePackageName) throws Exception {
        String path = basePackageName.replace(".", "\\");
        ClassLoader loader = ClassLoader.getSystemClassLoader();
        //获取编译后的class文件夹路径dirPath
        Enumeration<URL> enums = loader.getResources(path);
        String dirPath = "";
        while (enums.hasMoreElements()) {
            URL url = enums.nextElement();
            if (url != null) {
                String protool = url.getProtocol();
                if ("file".equals(protool)) {
                    dirPath = url.getPath();
                    dirPath = URLDecoder.decode(dirPath, "utf-8");
                    log.info("dirPath=" + dirPath);
                }
            }
        }
        return dirPath;
    }

    /**
     * 获取磁盘路径下的Java对象
     *
     * @param dirPath
     * @return
     */
    private List<String> getClassNameList(String dirPath) {
        List<String> classNameList = new ArrayList<>();
        //根据传入文件夹路径创建File对象
        File dir = new File(dirPath);
        //检查是否为文件夹
        if (dir.isDirectory()) {
            //遍历文件夹内的文件
            for (File f : dir.listFiles()) {
                //获取文件名,并删除后缀 xxx.class
                String fileName = f.getName();
                String[] split = fileName.split("\\.");
                if (split.length != 2) {
                    continue;
                }
                if (!split[1].equals("class")) {
                    continue;
                }
                fileName = fileName.substring(0, fileName.lastIndexOf("."));
                //添加到结果中
                classNameList.add(fileName);
            }
        }
        return classNameList;
    }

    /**
     * 拼接class全路径
     *
     * @param classNames
     * @param basePackageName
     * @return
     */
    private List<Class<?>> getClassList(List<String> classNames, String basePackageName) {
        //将获取到的包内文件名转换为反射对象
        List<Class<?>> classes = new ArrayList<>();
        for (String className : classNames) {
            try {
                classes.add(Class.forName(basePackageName + "." + className));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return classes;
    }

    /**
     * 根据字节码,获取带有注解的常量对象的字段值
     *
     * @param classList
     * @return
     * @throws Exception
     */
    private Set<String> getFieldQueueName(List<Class<?>> classList) throws Exception {
        Set<String> set = new HashSet();
        for (Class<?> aClass : classList) {
            MqRegister mqRegister = aClass.getAnnotation(MqRegister.class);
            if (mqRegister == null) {
                continue;
            }
            log.info("可以注册的常量对象:{}", aClass.getName());
            Object mqConst = aClass.newInstance();
            // 可以注册
            Field[] fields = aClass.getFields();
            for (Field field : fields) {
                String fieldName = field.getName();
                String queueName = field.get(mqConst).toString();
                log.info("可以注册的字段名称:" + fieldName + ",字段值:" + queueName);
                set.add(queueName);
            }
        }
        return set;
    }
}

 

完美!

标签:java,String,所有,List,basePackageName,获取,dirPath,return
From: https://www.cnblogs.com/newAndHui/p/17332762.html

相关文章

  • c&c++ 的window环境获取exe文件所在的目录
    #include <iostream>#include<stdio.h>#include <direct.h>#include <windows.h>#include<process.h>#include <atlstr.h>charbuff[MAX_PATH];//用于存放获取的路径信息。GetModuleFileName(NULL,buff,MAX_PATH);CStringstr2=buff;int......
  • 重学Java设计模式-行为型模式-迭代器模式
    重学Java设计模式-行为型模式-迭代器模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-23-重学Java设计模式《实战迭代器模式》.html#重学-java-设计模式-实战迭代器模式「模拟公司组织架构树结构关系-深度迭代遍历人员信息输出场景」迭代器模式介绍图......
  • 获取java HashMap 的容量和阈值
      publicstaticvoidmain(String[]args)throwsException{HashMap<Integer,Integer>m=newHashMap<>(9);Class<?>mapType=m.getClass();Fieldthreshold=mapType.getDeclaredField("threshold");......
  • 企业通过物联网中获取收益,需要经历哪几个阶段?
    物联网可以从简化流程发展到最终完成整个业务转型,企业现在非常重视对物联网的投资,最近发布的全球IT和业务决策者调查报告显示:81%的企业表示他们已经开始了他们的物联网旅程,或者计划在未来一年内进行。然而,很多人认为他们已经落后了,超过一半的受访者表示他们在完全驾驭物联网能力方......
  • Java 类的成员——成员变量
    如何声明成员变量语法格式:[修饰符1]class类名{[修饰符2]数据类型成员变量名[=初始化值];}说明:–          位置要求:必须在类中,方法外–          修饰符2(暂不考虑)常用的权限修饰符有:private、缺省、protected、public其他修饰符:st......
  • GROUP BY+join获取全部数据
     参考链接:groupby聚合分组后如何获取分组数据_group分组后返回全部数据_自己收藏学习的博客-CSDN博客SELECTr.device_id,GROUP_CONCAT(r.user_idSEPARATOR';')user_idfromrelatedasrJOINdevicesasdond.id=r.device_id#whered.group_id=1GROUPBYr.device......
  • 重学Java设计模式-行为型模式-命令模式
    重学Java设计模式-行为型模式-命令模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-21-重学Java设计模式《实战命令模式》.html#重学-java-设计模式-实战命令模式「模拟高档餐厅八大菜系-小二点单厨师烹饪场景」命令模式介绍图片来自:https://refactori......
  • 7.Java 网络编程之 Socket
    Java网络编程之Socket一、课程目标网络模型TCP协议与UDP协议区别Http协议底层实现原理。二、什么是网络模型网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然......
  • thinkphp6 获取刚入库的数据ID方法
    首先,插入数据,有3个方法都可以实现create()create方法返回当前模型的对象实例,用箭头符号就能获取主键ID如果你的自增ID是id的话,获取方法也要变成$order->id$order=order::create($data);echo$order->id;save()save方法返回新增总数,不能通过返回值获取。需要通过......
  • [nacos]JAR启动并加载/解析Nacos yml格式的配置文件时,报“java.nio.charset.Malformed
    1问题描述原因1:字符集不匹配nacos中配置文件的字符集为A,应用程序的读取配置文件时使用了字符集B,导致使用字符集B解码文件二进制流时字符解码失败。一般问题出在中文注释上原因2:(yml文件)配置格式有误2解决思路2.1原因1:字符集不匹配时方法[1]删除nacos配置文件中......