扫描class

这篇具有很好参考价值的文章主要介绍了扫描class。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用 hutool 的 ClassUtil.scanPackage

举例

    public static void test1() {
        Set<Class<?>> clazzList = ClassUtil.scanPackage("com.kedu.scm", Class::isEnum);
        for (Class<?> clazz : clazzList) {
            System.out.println(clazz);
            Object[] enumConstants = clazz.getEnumConstants();
            Arrays.stream(enumConstants).forEach(System.out::println);
        }
    }

运行结果

class com.fangye.base.enums.YesOrNoEnum
YES
NO

利用spring自写scanPackage

package com.fangye.base.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * class 工具类
 *
 * @author qizenan
 * @date 2023/07/13
 */
@Slf4j
public class ClassUtil {
    /**
     * 扫描包,获取指定class的集合
     *
     * @param basePackage 基本包
     * @param filter      过滤器
     * @return {@link List}<{@link Class}<{@link ?}>>
     */
    public static List<Class<?>> scanPackage(String basePackage, Predicate<Class<?>> filter) {
        List<Class<?>> classList = new ArrayList<>();
        if (StringUtils.isEmpty(basePackage)) {
            return classList;
        }
        basePackage = basePackage.replace(".", "/") + "/";
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + basePackage + "**/*.class";
        try {
            // 对 basePackage 包进行扫描
            ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
            if (resources.length == 0) {
                return classList;
            }
            MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory();
            for (Resource resource : resources) {
                if (!resource.isReadable()) {
                    continue;
                }
                MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
                Class<?> clazz = Class.forName(metadataReader.getClassMetadata().getClassName());
                if (filter != null && !filter.test(clazz)) {
                    continue;
                }
                classList.add(clazz);
            }
        } catch (Exception e) {
            log.info("扫描 package 失败", e);
        }
        return classList;
    }
}

测试

public static void main(String[] args) {
        List<Class<?>> clazzList = scanPackage("com.fangye.base", Class::isEnum);
        for (Class<?> clazz : clazzList) {
            System.out.println(clazz);
            Object[] enumConstants = clazz.getEnumConstants();
            Arrays.stream(enumConstants).forEach(System.out::println);
        }
    }

运行结果文章来源地址https://www.toymoban.com/news/detail-559933.html

class com.fangye.base.enums.YesOrNoEnum
YES
NO

到了这里,关于扫描class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file

    maven打包报错 java 运行时的最新版本(类文件版本 61.0)编译的,该版本的 Java 运行时只识别 52.0 以下的类文件版本 原因: 根据 Spring Boot with spring version 2.5.7 fails repackage with jdk 1.8 这篇文章中下面的说法 目标org.springframework.boot:spring-boot-maven插件:3.0.0-M1:重新打包失败:由于

    2024年02月13日
    浏览(44)
  • Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(49)
  • Java的反射应用(Method和Class)

    记录 :473 场景 :使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。 版本 :JDK 1.8。 1.使用Java反射调用指定类的指定方法 (1)参数说明 String className, 字符串类型,需反射的类的全路径。 String methodName, 字

    2024年02月08日
    浏览(44)
  • PHP调用java class 类实现文件签名

    起因:对接某平台API接口,发送的文件需要做 SM3 签名,对方平台是java写的,只有java加密示例,照着java的加密算法翻译为PHP版本,在编码转换上始终有些差异。没办法,只能想办法使用他们的java方式。 Demo.java文件:

    2024年02月09日
    浏览(52)
  • Golang实现JAVA虚拟机-解析class文件

    原文链接:https://gaoyubo.cn/blogs/de1bedad.html 所需前置知识为:JAVA语言、JVM知识、Go笔记 对应项目:jvmgo 操作系统:Windows 11 openjdk version \\\"1.8.0_382\\\" go version go1.21.0 windows/amd64 Java虚拟机的工作是运行Java应用程序。和其他类型的应用程序一样,Java应用程序也需要一个入口点,这个入

    2024年02月04日
    浏览(47)
  • Java笔记:使用javassist修改class文件内方法

    在工作突然有一个需求。线上运维的一个tomcat的web项目,运行的程序不正常。需要修改代码。可是这个项目代码非常的老,并且公司存储的源代码跟线上的不一致。 我了个擦,没有源代码但是还要结局客户的问题。只能到线上将对应程序的class文件拷贝到本地进行修改,每修

    2024年02月03日
    浏览(41)
  • Java异常和@Transactional(rollbackFor=Exception.class)

    在介绍之前我们先来了解几个Java异常的基本概念。如果你不懂异常,那看完我这篇文章应该很快对异常有了一个大概的了解。 1、 异常: 是指阻止当前方法或作用域继续执行的问题。 2、 Throwable类: 被用来表示任何可以作为异常被抛出的类,是所有错误或异常的超类。 3、

    2024年02月03日
    浏览(41)
  • HBase Java API 开发:表的扫描与扫描的缓存和批量处理 第1关:批量处理

    批量操作 如果我们去查看 HBaseAPI 的源码会发现,在上次实训中我们使用的 delete、get,put 这些批量操作,实际上都是调用了 batch() 方法。 查看 put(ListPut puts) 函数源码: 我们可以发现 put(ListPut puts) 方法最终还是调用的 batch(final List? extends Row actions, final Object[] results, int rpcTi

    2024年02月09日
    浏览(42)
  • 基于java服务端实现二维码扫描

    在Java中,可以使用第三方库来识别二维码内容。一个常用的库是ZXing(Zebra Crossing),它提供了强大的二维码处理功能。 首先,确保已将ZXing库添加到项目中。可以手动下载ZXing JAR文件,也可以使用构建工具(如Maven或Gradle)来管理依赖。 下面是使用ZXing库识别二维码内容的示

    2024年02月08日
    浏览(35)
  • Java中的实体类(entity class)和model

    编写代码时,经常会遇到一些具有“现实”意义的“ 个体 ”,eg:一个用户、一首歌曲、一条评论等。它们在逻辑上是完整的整体,具有相似的结构,但是却因为“ 属性 ”的不同而不同。 下面看一个典型的Entity class: 总结: 一个Entity类,代表了某一种“个体”,类中的属

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包