Java扫描指定路径下的类文件,Java获取jar包内的文件

工具-----Java 扫描指定包下类 (包括jar包中的java类) Java 扫描指定包下类 (包括jar包中的java类) 在某些场景中,我们需要得到某个包名下面所有的类,不仅仅是我们自己在写的包下面java类还有一些jar包(一些第三方提供的jar包里的类,一些是自己写的类)可以看下图,其结构如此: 比如我们想得到PackageScanner.java这个类 执行这个类 打印出的URL即目前的包的位置的一串字符串,其中replace方法时... 阅读详情

1.思路

通过给定的包名,获取到该资源路径,然后判断该路径是文件夹还是jar包。

如果是文件夹,直接通过 File.listFile() 方法获取所有文件,然后找到类文件。

如果是 jar 包的话,则通过 jarInputStream 构造 jarEntry 获取文件。

2.代码

 

package com.example.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

/**
 * @author 相柳
 * @date 2021/7/7
 */
public class Main {

    /**
     * 扫描指定路径下的类文件
     *
     * @param packagePath 包路径
     * @return Set<String>
     */
    public static Set<String> scan(String packagePath) {
        // 转化包路径为文件路径
        String scanPath = packagePath.replace(".", "/");
        // 扫描
        ClassLoader classLoader = Main.class.getClassLoader();
        URL resource = classLoader.getResource(scanPath);
        Set<String> fileNameSet = new LinkedHashSet<>();
        if (resource == null) {
            throw new RuntimeException("资源不存在:" + packagePath);
        }

        String rootPath = getRootPath(resource);

        if (isJarFile(resource.getFile())) {
            try {
                // 是jar包使用JarInputStream
                JarInputStream jarInputStream = new JarInputStream(new FileInputStream(rootPath));
                JarEntry nextJarEntry = jarInputStream.getNextJarEntry();
                // 遍历
                while (null != nextJarEntry) {
                    String name = nextJarEntry.getName();
                    // 如果是指定包名下的文件并且是.class结尾,那就保存它
                    if (name.startsWith(scanPath) && isClassFile(name)) {
                        fileNameSet.add(name.replace(".class", ""));
                    }
                    nextJarEntry = jarInputStream.getNextJarEntry();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            // 是文件夹,获取该文件夹下所有文件
            Set<String> allFilePath = getAllFilePath(rootPath);
            for (String filePath : allFilePath) {
                fileNameSet.add(transFilePathToPackagePath(filePath, scanPath));
            }
        }
        return fileNameSet;
    }

    /**
     * 遍历获取某个文件下所有文件名称
     *
     * @param path path
     * @return Set<String>
     */
    private static Set<String> getAllFilePath(String path) {
        Set<String> fileSet = new LinkedHashSet<>();
        File file = new File(path);
        return getAllFilePath(fileSet, file);
    }

    /**
     * 递归遍历获取某个文件下所有文件名称
     *
     * @param fileSet fileSet
     * @param file    源文件
     * @return Set<String>
     */
    private static Set<String> getAllFilePath(Set<String> fileSet, File file) {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File file1 : files) {
                    getAllFilePath(fileSet, file1);
                }
            }
        } else {
            if (isClassFile(file.getAbsolutePath())) {
                fileSet.add(file.getAbsolutePath());
            }
            return fileSet;
        }
        return fileSet;
    }

    /**
     * 把文件路径转为包路径
     *
     * @param filePath filePath
     * @param scanPath 扫描路径
     * @return String
     */
    private static String transFilePathToPackagePath(String filePath, String scanPath) {
        filePath = filePath.replace("\\", "/");
        String substring = filePath.substring(filePath.indexOf(scanPath), filePath.indexOf(".class"));
        return substring.replace("\\", ".").replace("/", ".");
    }

    /**
     * 判断一个文件是不是jar包
     *
     * @param fileName fileName
     * @return true-是,false-否
     */
    private static boolean isJarFile(String fileName) {
        return fileName.contains(".jar!");
    }

    /**
     * 判断一个文件class文件
     *
     * @param fileName fileName
     * @return true-是,false-否
     */
    private static boolean isClassFile(String fileName) {
        return fileName.endsWith(".class");
    }

    /**
     * 获取文件路径
     *
     * @param url url
     * @return String
     */
    private static String getRootPath(URL url) {
        String path = url.getFile();
        if (path.contains("!")) {
            return path.substring(5, path.indexOf("!"));
        }
        return path;
    }

}

myeclipse 生成jar包后,spring无法扫描到bean定义 之前,我曾经写过一篇Java遍历包中所有类,但经过一名网友提醒发现,只能适用于项目src中的包,当包在jar里时就无法遍历jar里的类。就此我针对代码进行了细化,功能得到进一步的完善。 在分享源码之前,先说说我在遍历jar包中的类时所遇到的困难。 这是我测试用的jar包,结构如下: 无论包是在src中还是在jar中,其实根本的思路还是根据给的包域名(如:com.wang.... 阅读详情

相关推荐

扫描jar包工具

java -jar jarscan.jar 查看help信息,可以快速扫描目标文件夹下jar包所包含的class文件相关信息

java 判断代码运行时是否是在 jar 包中运行

有些时候我们想判断代码是不是被打成了 jar 包在通过 java -jar 命令运行的,还是通过 idea 或者 eclipse 这样的开发工具运行的,可以通过如下方式进行判断。这样一来就可以轻松的判断是不是在 jar 包中运行,如果是在 jar 包中运行你就可以做一些其他操作了。

西凉的悲伤博客 1448

packgescanner.jar

Java包扫描(包括jar包扫描),通过对该工具的使用,可以扫描包,包括jar包下的类,取得其元数据类。

java如何扫描指定路径下的所有文件夹及文件,包括指定文件类型

【代码】java如何扫描指定路径下的所有文件夹及文件。

JackTian_的博客 1911

头歌平台-人工智能导论实验(人脸识别)

答案仅供参考,自己动手丰衣足食!!!

qq_52119136的博客 3028

清理异常值(MAD:绝对中位差)

清理异常数据: 中位数绝对偏差(MAD):用来描述单变量样本在定量数据中可变的一种标准 在统计学中,绝对中位差是刻画一元数据样本变化的一个鲁棒度量。由公式可以看出,其求解还算简单,给定一个数据样本集,首先求其中位数,然后求原始数据减去中位数的绝对值从而形成一个新的数据样本,再求新的数据样本的中位数即为绝对中位差。比如说有一个数据样本集X={2 3 8 7 9 6 4},这时候数据的中位数是6,原...

spider_man 1万+

Java 扫描某包下所有类的注解并获得注解值

之前,设计的一个大型后台的多模块项目,没有按照模块化分库,每个模块的表都放在同一个模块里。公司现在的开发新项目有类似功能,都把之前的模块打成jar包引入新的项目代码中,但是你不熟悉这个模块都用到那些表,之前建表的时候,也没有按照模块名作为前缀去建表,导致迁移表的时间都浪费在 分辨那些表有用到上面。 下面运用反射去扫描模块包下,数据库entity类的@tablename注解的值,可以快速打印出该模块引用的表有哪些,代码实现如下。 pom文件引入依赖 <depend..

洛阳泰山的博客 6752

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

java扫描获工程取所有文件,获取所有工程文件夹

扫描获取所有文件,以及工程文件夹        使用java.nio.file工具包,读取文件,读取文件夹。整体思路就是一层层剥取,由头部向尾部递归获取所有文件。 使用java.nio.file工具包 Path path = Paths.get("Src"); //得到Src的一个Path 对象 Stream stream = Files.list(path); //获取Src文件夹下的文件,文件夹,流对象 List fileLi..

loney_wolf的博客 865

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5288

R语言中的Gamma分布函数

在R语言中,我们可以使用最大似然估计(Maximum Likelihood Estimation,MLE)或最小二乘估计(Least Squares Estimation,LSE)等方法来估计Gamma分布的参数。本文介绍了在R语言中使用Gamma分布函数的基本操作,包括生成随机变量、计算概率密度函数和累积分布函数,以及参数估计和拟合。函数来生成Gamma分布的随机变量,计算概率密度函数(PDF)和累积分布函数(CDF),以及进行参数估计和拟合。要计算Gamma分布的累积分布函数(CDF),我们可以使用。

ByteWhiz的博客 1633

在Java中扫描jar包中的文件

URI is not hierarchical

qq_43144781的博客 906

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 290

扫描java类文件_Java扫描包路径下的类文件

前言:在写代码的时候,经常会遇到一些配置包路径的代码,然后框架根据提供的包路径进行扫描,比如Spring。所以这里自己去实现一下扫描包路径下类的代码。在看资料的过程中,总结出了两个不同的扫描方式,第一种是在扫描src下的包,这时候使用文件系统就可以获取到包下面的类文件;第二种是扫描jar包中的包路径,这时候需要使用JarURLConnection类了,这个可以将Jar包中目标包路径下的文件生成一个...

weixin_39805734的博客 291

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 641

ROS2 机械臂末端刀具执行曲面路径规划入门教程

Noether工具路径规划系统摘要 Noether是一款用于网格曲面刀具路径规划的软件,支持喷涂、打磨、检测等机器人工艺流程。其核心流程分为三步:1)网格修改(平滑、分割等预处理);2)刀具路径规划(生成有序路径点序列);3)刀具路径修改(姿态调整等后期处理)。系统提供栅格规划和边界规划两种模式,支持自定义扩展。配套GUI工具可配置完整流程,包含网格处理、路径生成和可视化功能。通过示例演示了多组件网格处理、拼图边缘铣削等典型应用场景,并指导用户进行插件开发,实现圆柱体提取、摄像机悬停等定制化功能。系统采用模

机器人控制与仿真应用 917

java扫描目录下的文件_Java扫描包路径下的类文件

前言:在写代码的时候,经常会遇到一些配置包路径的代码,然后框架根据提供的包路径进行扫描,比如Spring。所以这里自己去实现一下扫描包路径下类的代码。在看资料的过程中,总结出了两个不同的扫描方式,第一种是在扫描src下的包,这时候使用文件系统就可以获取到包下面的类文件;第二种是扫描jar包中的包路径,这时候需要使用JarURLConnection类了,这个可以将Jar包中目标包路径下的文件生成一个...

weixin_42126677的博客 762

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java扫描自定路径下类文件

1. 扫描类 Java代码 收藏代码 import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration...

笔记 570

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java扫描包路径下的类文件

前言: 在写代码的时候,经常会遇到一些配置包路径的代码,然后框架根据提供的包路径进行扫描,比如Spring。所以这里自己去实现一下扫描包路径下类的代码。 在看资料的过程中,总结出了两个不同的扫描方式,第一种是在扫描src下的包,这时候使用文件系统就可以获取到包下面的类文件;第二种是扫描jar包中的包路径,这时候需要使用JarURLConnection类了,这个...

weixin_30765319的博客 751

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java 扫描jar包_java 扫描指定包(包括jar包)

/*未经本人同意,禁止转载。做工程时,有时候需要扫描指定包,或者指定jar包,甚至扫描指定包下指定类,本文章详细讲解如何扫描,以及智能扫描,小编讲的很详细了仔细看。以下讲解, 包扫描和jar包扫描,自动识别包扫描还是jar包扫描。//下文需要一个ClassLoader,private ClassLoader classLoader;public PackageParse() {}//因为得到jav...

weixin_42546361的博客 1819

java 扫描指定包(包括jar包)

/*未经本人同意,禁止转载。 做工程时,有时候需要扫描指定包,或者指定jar包,甚至扫描指定包下指定类,本文章详细讲解如何扫描,以及智能扫描,小编讲的很详细了仔细看。 以下讲解, 包扫描和jar包扫描,自动识别包扫描还是jar包扫描。 //下文需要一个ClassLoader, private ClassLoader classLoader; public PackageParse() ...

qq_42034205的博客 2231

Java获取包或jar下面的所有class文件

import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.*; import java.util.jar.JarEntry; import java.util....

才子佳人的博客 3326

ClassLoader:Java实现从指定路径加载jar包/class文件

项目背景: 在线计算开发平台在 yarn客户端 提交机上 提交Flink任务时,需要加载 非结构化数据解析器jar 和 自定义函数jar 方案: 考虑到 java 自带的 ClassLoader 无法灵活的添加某路径下的类,考虑以下三种方式实现: AppClassLoader 继承自 URLClassLoader,以反射的方式将 addURL 方法设置为 public,以添加自定义路径为 cla...

super_wj0820的博客 1万+

java 加载 jar_JAVA动态加载指定路径下的jar

前言完整的男人在开发项目的时候,一个优秀的项目通常不光是性能强悍、健壮就够的,通常我们还需要考虑代码的可维护性和可扩展性。可维护性与可扩展性:主要是方便代码交接之后,其他人能看懂,然后在你的代码基础上继续愉快的开发。如果说上一任程序员设计的框架非常完美,逻辑清晰,注释丰富,我一拿到就能直接上手添加新的功能,那开发体验肯定是非常棒的,也不会产生负能量链(名词解释:负能量链就是我接手了上一任程序员乱七...

weixin_30558137的博客 1983

Java包扫描(包含Jar包的扫描)

Java包扫描

不二的博客 1780

Java用数组的包文件_在Java中获取包内的类文件数组

我能够使用普通的文件I / O和搜索机制来解决这个问题.您可以在此处查看答案.private static List getClassesForPackage(Package pkg) {String pkgname = pkg.getName();List classes = new ArrayList();// Get a File object for the packageFile dir...

weixin_42351102的博客 131
上一篇: 不常见类、接口和注解汇总备忘
下一篇: 数据库事务
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值