包扫描工具实现(详解)

article/2025/9/21 18:39:05

文章目录

  • 前言
  • 包扫描
    • 实现思路(需求分析):
  • 具体实现
  • 完整代码

前言

注解在 Java 是一个非常重要的存在,而且它出现的非常频繁。

在一个工程下可能有许多的包或者Jar包,为了结合注解可以准确的定位到一个需要的类上,并且扫描到一个包下的所有类方便我们使用反射机制,所以产生了包扫描工具实现的想法,它可以帮我们找到带有注解的类,再通过反射执行。

包扫描

我们可以通过用户提供的包名,扫描该包下的所有类。

实现思路(需求分析):

通过博主思考,我们需要实现功能:

  • 一个工程下存在普通包或者Jar包,分开处理 Jar 包和普通包;

  • 得到该包下我们所要找的类(例如:带有注解的类或者接口或者枚举类型等)这里主要用于扫描带有注解的类。

因为通过包扫描找到该类,我们可以通过注解信息得到该类里面带有注解的成员或方法的信息,然后通过反射机制执行。

具体实现

  • 创建一个 IClassDealer接口:
public interface IClassDealer {void classDealer(Class<?> klass);
}
  • 包扫描类实现:

    • 这里根据包名,通过得到 url 协议名称,然后判断是 Jar 包还是普通包,如果是普通包就调用 fileScan(String packageName, File dir)这个方法,进行普通包扫描,如果是 Jar 包,就调用jarScan(String packageName, URL url),进行 Jar 扫描。

      	public void scanPackage(String packageName) throws URISyntaxException {String packagePath = packageName.replace(".", "/");URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);if (url.getProtocol().equals("file")) {File root = new File(url.toURI());fileScan(packageName, root);} else if (url.getProtocol().equals("jar")) {try {jarScan(packageName, url);} catch (IOException e) {e.printStackTrace();}}}
      
    • 普通包扫描

      	private void fileScan(String packageName, File dir) {File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory()) {fileScan(packageName + "." + file.getName(), file);} else {String fileName = file.getName();if (!fileName.endsWith(".class") || fileName.contains("$")) {continue;}fileName = fileName.replace(".class", "");String className = packageName  + "." + fileName;try {Class<?> klass = Class.forName(className);classDealer.classDealer(klass);} catch (ClassNotFoundException e) {e.printStackTrace();continue;}}}}
      
    • Jar 扫描

      	private void jarScan(String packageName, URL url) throws IOException {JarURLConnection connection = (JarURLConnection) url.openConnection();JarFile jarFile = connection.getJarFile();Enumeration<JarEntry> entries = jarFile.entries();while (entries.hasMoreElements()) {JarEntry entry = entries.nextElement();String entryName = entry.getName();String className = entryName.replace("/", ".");if (!className.startsWith(packageName) || className.contains("$") || !entryName.endsWith(".class")) {continue;}className = className.replace(".class", "");try {Class<?> klass = Class.forName(className);classDealer.classDealer(klass);} catch (ClassNotFoundException e) {e.printStackTrace();}}}
      

完整代码

  • 创建一个 IClassDealer接口:
public interface IClassDealer {void classDealer(Class<?> klass);
}
  • 包扫描具体代码:
package com.hb.util;import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;public class PackageScanner {/***因为扫描到的类的相关具体操作不是本工具需要完成的,*因此给一个接口,具体操作由工具使用者完成。*用这个方法可以去筛选使用者需要扫描的包下的类达到自己的目的。*/private IClassDealer classDealer;public PackageScanner() {this.classDealer = new IClassDealer() {@Overridepublic void classDealer(Class<?> klass) {}};}public PackageScanner addClassDealer(IClassDealer classDealer) {this.classDealer = classDealer;return this;}public void scanPackage(String packageName) throws URISyntaxException {String packagePath = packageName.replace(".", "/");URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);if (url.getProtocol().equals("file")) {File root = new File(url.toURI());fileScan(packageName, root);} else if (url.getProtocol().equals("jar")) {try {jarScan(packageName, url);} catch (IOException e) {e.printStackTrace();}}}private void jarScan(String packageName, URL url) throws IOException {JarURLConnection connection = (JarURLConnection) url.openConnection();JarFile jarFile = connection.getJarFile();Enumeration<JarEntry> entries = jarFile.entries();while (entries.hasMoreElements()) {JarEntry entry = entries.nextElement();String entryName = entry.getName();String className = entryName.replace("/", ".");if (!className.startsWith(packageName) || className.contains("$") || !entryName.endsWith(".class")) {continue;}className = className.replace(".class", "");try {Class<?> klass = Class.forName(className);classDealer.classDealer(klass);} catch (ClassNotFoundException e) {e.printStackTrace();}}}private void fileScan(String packageName, File dir) {File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory()) {fileScan(packageName + "." + file.getName(), file);} else {String fileName = file.getName();if (!fileName.endsWith(".class") || fileName.contains("$")) {continue;}fileName = fileName.replace(".class", "");String className = packageName  + "." + fileName;try {Class<?> klass = Class.forName(className);classDealer.classDealer(klass);} catch (ClassNotFoundException e) {e.printStackTrace();continue;}}}}
}

测试运行结果:


http://chatgpt.dhexx.cn/article/yRb5XnIZ.shtml

相关文章

IP扫描工具

什么是高级 IP 扫描仪 高级 IP 扫描程序是网络中必不可少的工具&#xff0c;使管理员能够跟踪网络地址空间。在提供要扫描的 IP 地址范围时&#xff0c;高级 IP 扫描程序会借助网络扫描协议按顺序检查该范围内的每个 IP&#xff0c;扫描后&#xff0c;高级 IP 扫描程序工具可查…

【实用工具】文件扫描

闲来无事&#xff0c;想着自己的硬盘里大大小小存了一堆的文件&#xff0c;想去根据文件大小或者修改时间对全盘进行扫描排序&#xff0c;好像windows系统上并不支持这样的功能&#xff08;只能在单个目录下对当前目录中文件进行排序&#xff09;。那么咱们就做一个定制化的文件…

扫描工具使用

nessus 基础使用 进入这个连接去获取激活码&#xff1a;https://zh-cn.tenable.com/products/nessus/activation-code?tns_redirecttrue 安装好Nessus&#xff0c;自动弹出一个页面&#xff0c;然后去注册 注册成功后连接SSL 出现这个界面说明已经成功了 2 awvs使用 先在虚…

QingScan扫描器安装、使用

一、 QingScan介绍 QingScan是一个安全工具整合系统&#xff0c;解决你平时使用各种工具一个个打 开填写扫描目标的麻烦过程&#xff1b;QingScan工具只需要你把URL给它&#xff0c;它会调 用市面上各种扫描工具&#xff0c;对URL扫描&#xff0c;最后把结果汇聚展示 项目地址…

IP地址扫描程序/扫描工具

随着许多组织采用自带设备 &#xff08;BYOD&#xff09; 等策略&#xff0c;IT 网络变得越来越复杂。随着越来越多的设备连接到网络&#xff0c;IP 地址扫描势在必行&#xff0c;以确保设备在连接到网络时不会遇到问题。IP 地址扫描器是 OpUtils 中的一个模块&#xff0c;是一…

4个万能的扫描工具,各种文件3秒扫描成电子档

分享4个万能的扫描工具&#xff0c;各种图片上的文字、证件照、书籍都能快速扫描成电子档文件&#xff0c;不管是手机还是电脑上的都能扫描成电子文件&#xff0c;大家可以根据自己的需求选择对应的描述工具。 一、手机扫描工具 1、万能图片转换器 一个专门用来处理手机图片…

网络安全的十大最佳网络扫描工具

在当今世界&#xff0c;网络安全不需要介绍或解释。我们都知道&#xff0c;网络安全一词是指保护任何计算机网络&#xff0c;旨在防止任何人以任何方式访问、操纵或滥用网络。因此&#xff0c;我们有与监视和保护计算机网络有关的规则&#xff0c;政策和说明。 网络扫描是维护…

系统扫描器

本次介绍三款系统扫描器&#xff1a; nmap kali系统自带工具 天镜 启明星辰 Nessus 国外排名第一 一、Nmap扫描器 主要功能&#xff1a;主机发现、端口扫描、版本侦测、OS侦测、漏洞扫描 优势&#xff1a; 功能灵…

扫描工具(一)

一、 nmap工具 Nmap 是一种常用工具&#xff0c;可用于判定网络的布局。我们可以在网络上使用 Nmap 来查找主机系统以及打开这些系统的端口。 nmap作用 检测存活在网络上的主机&#xff08;主机发现&#xff09;检测主机上开放的端口&#xff08;端口发现&#xff09;检测相…

利用Google Chrome滚动截屏,截取整个网页

利用Google Chrome滚动截屏 1. 在Chrome浏览器中打开一个网址&#xff0c;比如www.master8687.cn,然后再页面中鼠标右键&#xff0c;选择 检查 项。 2. 在左侧的设备选择区域&#xff0c;选择iPad Pro 3. 然后再more Option选择Capture full size screenshot 4. 此时则会在浏览…

谷歌浏览器截图(截取整个网页)

1、按下键盘上的F12键&#xff0c;进入开发者工具 2、按下组合键CtrlShiftP 3、在搜索框中输入Capture full size screenshot 4、点击Capture full size screenshot选项即可截取长屏 补充说明&#xff1a;截图自动保存保存为png格式的图片文件,可右击打开保存路径的文件夹查…

浏览器截图截取整个页面的方法

浏览器截图截取整个页面的方法进入到你要截取的页面后总共就只有四步: F12 出现了开发者工具&#xff08;有可能是在左边也有可能是右边&#xff0c;或者单独出一个小窗口&#xff09; 如果没有反应的话说明那个页面的F12被禁用了&#xff0c;你需要点击右上方的设置&#xf…

使用谷歌浏览器截图整个网页

使用谷歌浏览器截图整个网页 一、方法一二、方法二 一、方法一 1、首先打开想要截图的网页&#xff0c;按键盘快捷键F12&#xff0c;打开开发人员工具功能。 2、在开发工具页面同时按下Ctrl Shift P&#xff0c;出现输入指令的工具栏 3、在工具栏输入Capture full size sc…

Chrome利器之FireShot:网页长截图工具

首先对于很多写博客写文章的笔友来说&#xff0c;难免少不了一些网页截图或者gif图之类的&#xff0c;现在这里讲的是一个便捷的谷歌浏览器长截图插件&#xff1a;FireShot FireShot功能特点&#xff1a; 可以截取整个页面、可见部分和选定区域&#xff0c;并且支持拖动加载截…

超好用的PC截图工具Snipaste—免费便捷高效

一次电脑软件分享 文章目录 安装方式使用教学深度学习 首先附上安装包 百度网盘Snipaste-2.7.3-Beta-x64版压缩包 链接&#xff1a;https://pan.baidu.com/s/12mWii8lcDCKrt4HKrCUQZg 提取码&#xff1a;5aqj 官网下载地址 snipaste官网下载 snipaste是一款简单但是强大的截…

在电脑浏览器上怎样对一整个页面进行完整的截图?(整站截图)

整站截图 步骤&#xff1a; ①&#xff1a;将整个网站拉到最底部。 ②&#xff1a;右键点击&#xff0c;选择检查。 ③&#xff1a;ctrl shift p快捷键呼出输入框。&#xff08;检查快捷键是否冲突&#xff09; ④&#xff1a;在输入框中输入 capture full size screenshot …

网页滚动截图

首先打开要截屏的网页&#xff0c;然后按F12&#xff0c;打开开发者工具。 然后按CtrlShiftP&#xff0c;调出命令输入框&#xff0c;并在命令框中输入full&#xff0c;这时候应该会列出一个选项&#xff0c;“Screenshot capture full size screen”&#xff0c;点击它&#…

如何对整个网页截图

当网页的长度超过一屏时&#xff0c;如何才能对整个网页的内容截图呢&#xff1f;小一说两个网页截图的方法&#xff01; 1、使用傲游浏览器&#xff08;Maxthon&#xff09; 如果你使用的是傲游浏览器&#xff0c;那你有福了&#xff0c;傲游浏览器可以直接对网页进行截图&a…

JS 实现网页截屏

要实现这个功能就必须要介绍一款特别好用的插件: html2canvas 他的用法也特别傻瓜式只需要两行代码就可以实现网页截屏的功能 html2canvas(document.body).then(function(canvas) {document.body.appendChild(canvas); });下面看例子 这里我们的body标签高度是3023, 浏览器肯…

一款实用的web截图工具(一)

码云地址&#xff1a; 码云 github地址&#xff1a; github kscreenshot 介绍 web截图工具的功能实现基于Canvas技术。其功能主要包括截图&#xff0c;下载&#xff0c;复制以及在截图过程中通过工具栏对截图进行绘制。 使用 具体使用方法请戳 码云 GitHub 实现方式 本…