我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用java怎么扫描指定包下的类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用java怎么扫描指定包下的类

本篇文章给大家分享的是有关使用java怎么扫描指定包下的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

class="lazy" data-src下面的类如何获取:

首先,比较简单的是得到我们自己写的类,我们先来完成这个,

项目的结构图如下:

使用java怎么扫描指定包下的类

我故意创建了这么个比较复杂的项目结构,现在我们就来获取com.baibin包下所有的类,并且打印他们,代码如下:

import org.junit.Test;import java.io.File;import java.util.ArrayList;import java.util.List;public class Main {    List<String> classPaths = new ArrayList<String>();    @Test    public void searchClass() throws ClassNotFoundException {        //包名        String basePack = "com.baibin";        //先把包名转换为路径,首先得到项目的classpath        String classpath = Main.class.getResource("/").getPath();        //然后把我们的包名basPach转换为路径名        basePack = basePack.replace(".", File.separator);        //然后把classpath和basePack合并        String searchPath = classpath + basePack;        doPath(new File(searchPath));        //这个时候我们已经得到了指定包下所有的类的绝对路径了。我们现在利用这些绝对路径和java的反射机制得到他们的类对象        for (String s : classPaths) {            //把 D:\work\code\20170401\search-class\target\classes\com\baibin\search\a\A.class 这样的绝对路径转换为全类名com.baibin.search.a.A            s = s.replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"").replace("\\",".").replace(".class","");            Class cls = Class.forName(s);            System.out.println(cls);        }    }        private void doPath(File file) {        if (file.isDirectory()) {//文件夹            //文件夹我们就递归            File[] files = file.listFiles();            for (File f1 : files) {                doPath(f1);            }        } else {//标准文件            //标准文件我们就判断是否是class文件            if (file.getName().endsWith(".class")) {                //如果是class文件我们就放入我们的集合中。                classPaths.add(file.getPath());            }        }    }}

效果如下:

使用java怎么扫描指定包下的类

总结:这样的class="lazy" data-src下面的都比较容易处理,也很容易想到,但是jar包下面的就没这么简单了,

但是还是有办法的。

jar中的类如何获取:

jar下的类我们可以通过JarURLConnection类来或者,代码如下:

import org.junit.Test;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.util.Enumeration;import java.util.jar.JarEntry;import java.util.jar.JarFile;public class JarMain {    @Test    public void searchClass() throws IOException, ClassNotFoundException {        String basePack = "org.junit";        //通过当前线程得到类加载器从而得到URL的枚举        Enumeration<URL> urlEnumeration = Thread.currentThread().getContextClassLoader().getResources(basePack.replace(".", "/"));        while (urlEnumeration.hasMoreElements()) {            URL url = urlEnumeration.nextElement();//得到的结果大概是:jar:file:/C:/Users/ibm/.m2/repository/junit/junit/4.12/junit-4.12.jar!/org/junit            String protocol = url.getProtocol();//大概是jar            if ("jar".equalsIgnoreCase(protocol)) {                //转换为JarURLConnection                JarURLConnection connection = (JarURLConnection) url.openConnection();                if (connection != null) {                    JarFile jarFile = connection.getJarFile();                    if (jarFile != null) {                        //得到该jar文件下面的类实体                        Enumeration<JarEntry> jarEntryEnumeration = jarFile.entries();                        while (jarEntryEnumeration.hasMoreElements()) {                                                        JarEntry entry = jarEntryEnumeration.nextElement();                            String jarEntryName = entry.getName();                            //这里我们需要过滤不是class文件和不在basePack包名下的类                            if (jarEntryName.contains(".class") && jarEntryName.replaceAll("/",".").startsWith(basePack)) {                                String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replace("/", ".");                                Class cls = Class.forName(className);                                System.out.println(cls);                            }                        }                    }                }            }        }    }}

通过这两种方式我们就可以得到指定包名下面所有的类了,这个还是挺有用的,

比如spring中经常用来扫描指定包注解的实现等。

补充:获取指定包名下的所有类

写了一个工具类,用于获取指定包名下的所有类,支持递归遍历,支持注解过滤,可从 classpath (class 文件与 jar 包)中获取。

import java.io.File;import java.io.FileFilter;import java.lang.annotation.Annotation;import java.net.JarURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.jar.JarEntry;import java.util.jar.JarFile;public class ClassUtil {    // 获取指定包名下的所有类    public static List<Class<?>> getClassList(String packageName, boolean isRecursive) {        List<Class<?>> classList = new ArrayList<Class<?>>();        try {            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("\\.", "/"));            while (urls.hasMoreElements()) {                URL url = urls.nextElement();                if (url != null) {                    String protocol = url.getProtocol();                    if (protocol.equals("file")) {                        String packagePath = url.getPath();                        addClass(classList, packagePath, packageName, isRecursive);                    } else if (protocol.equals("jar")) {                        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();                        JarFile jarFile = jarURLConnection.getJarFile();                        Enumeration<JarEntry> jarEntries = jarFile.entries();                        while (jarEntries.hasMoreElements()) {                            JarEntry jarEntry = jarEntries.nextElement();                            String jarEntryName = jarEntry.getName();                            if (jarEntryName.endsWith(".class")) {                                String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");                                if (isRecursive || className.substring(0, className.lastIndexOf(".")).equals(packageName)) {                                    classList.add(Class.forName(className));                                }                            }                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        return classList;    }    // 获取指定包名下的所有类(可根据注解进行过滤)    public static List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {        List<Class<?>> classList = new ArrayList<Class<?>>();        try {            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("\\.", "/"));            while (urls.hasMoreElements()) {                URL url = urls.nextElement();                if (url != null) {                    String protocol = url.getProtocol();                    if (protocol.equals("file")) {                        String packagePath = url.getPath();                        addClassByAnnotation(classList, packagePath, packageName, annotationClass);                    } else if (protocol.equals("jar")) {                        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();                        JarFile jarFile = jarURLConnection.getJarFile();                        Enumeration<JarEntry> jarEntries = jarFile.entries();                        while (jarEntries.hasMoreElements()) {                            JarEntry jarEntry = jarEntries.nextElement();                            String jarEntryName = jarEntry.getName();                            if (jarEntryName.endsWith(".class")) {                                String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");                                Class<?> cls = Class.forName(className);                                if (cls.isAnnotationPresent(annotationClass)) {                                    classList.add(cls);                                }                            }                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        return classList;    }    private static void addClass(List<Class<?>> classList, String packagePath, String packageName, boolean isRecursive) {        try {            File[] files = getClassFiles(packagePath);            if (files != null) {                for (File file : files) {                    String fileName = file.getName();                    if (file.isFile()) {                        String className = getClassName(packageName, fileName);                        classList.add(Class.forName(className));                    } else {                        if (isRecursive) {                            String subPackagePath = getSubPackagePath(packagePath, fileName);                            String subPackageName = getSubPackageName(packageName, fileName);                            addClass(classList, subPackagePath, subPackageName, isRecursive);                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    private static File[] getClassFiles(String packagePath) {        return new File(packagePath).listFiles(new FileFilter() {            @Override            public boolean accept(File file) {                return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();            }        });    }    private static String getClassName(String packageName, String fileName) {        String className = fileName.substring(0, fileName.lastIndexOf("."));        if (StringUtil.isNotEmpty(packageName)) {            className = packageName + "." + className;        }        return className;    }    private static String getSubPackagePath(String packagePath, String filePath) {        String subPackagePath = filePath;        if (StringUtil.isNotEmpty(packagePath)) {            subPackagePath = packagePath + "/" + subPackagePath;        }        return subPackagePath;    }    private static String getSubPackageName(String packageName, String filePath) {        String subPackageName = filePath;        if (StringUtil.isNotEmpty(packageName)) {            subPackageName = packageName + "." + subPackageName;        }        return subPackageName;    }    private static void addClassByAnnotation(List<Class<?>> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) {        try {            File[] files = getClassFiles(packagePath);            if (files != null) {                for (File file : files) {                    String fileName = file.getName();                    if (file.isFile()) {                        String className = getClassName(packageName, fileName);                        Class<?> cls = Class.forName(className);                        if (cls.isAnnotationPresent(annotationClass)) {                            classList.add(cls);                        }                    } else {                        String subPackagePath = getSubPackagePath(packagePath, fileName);                        String subPackageName = getSubPackageName(packageName, fileName);                        addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass);                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}

以上就是使用java怎么扫描指定包下的类,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用java怎么扫描指定包下的类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用java怎么扫描指定包下的类

本篇文章给大家分享的是有关使用java怎么扫描指定包下的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. And
2023-06-14

怎么使用Python-nmap网络扫描和嗅探工具包

这篇文章将为大家详细讲解有关怎么使用Python-nmap网络扫描和嗅探工具包,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。nmap概念NMap,也称为网络映射器,最初是Linux下的网络扫
2023-06-02

Linux的nmap扫描端口命令怎么使用

本篇内容介绍了“Linux的nmap扫描端口命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!nmap扫描端口命令是“nmap -s
2023-07-04

Ubuntu系统下怎么安装和使用网络扫描工具Zenmap

本篇内容主要讲解“Ubuntu系统下怎么安装和使用网络扫描工具Zenmap”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu系统下怎么安装和使用网络扫描工具Zenmap”吧!Zenmap
2023-06-13

Springboot怎么使用maven打包指定mainClass

这篇“Springboot怎么使用maven打包指定mainClass”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri
2023-07-06

java同一个包下的类怎么互相调用

在同一个包下的类可以直接互相调用,不需要使用任何关键字或语法来指明调用关系。只需在需要调用的方法前面加上类名即可。例如,假设有两个类A和B在同一个包下,其中A类中有一个方法需要调用B类中的方法,可以直接在A类中调用B类的方法,如下所示:``
2023-08-20

使用vbs怎么复制指定文件到指定目录下

这篇文章给大家介绍使用vbs怎么复制指定文件到指定目录下,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。核心代码Set fso=CreateObject("Scripting.filesystemobject")Func
2023-06-08

java中怎么使用filewriter指定编码

在Java中,可以使用FileWriter来指定编码。下面是一个示例代码:```javaimport java.io.FileWriter;import java.io.IOException;import java.io.Unsuppor
2023-09-29

.NET Core怎么使用C#扫描并读取图片中的文字

这篇文章主要讲解了“.NET Core怎么使用C#扫描并读取图片中的文字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET Core怎么使用C#扫描并读取图片中的文字”吧!程序测试环境:
2023-06-22

java怎么获取指定路径下的文件

在Java中,可以使用File类来获取指定路径下的文件。以下是获取指定路径下的文件的示例代码:import java.io.File;public class Main {public static void main(String[]
java怎么获取指定路径下的文件
2024-02-29

vue3+ts中怎么使用ref与reactive指定类型

今天小编给大家分享一下vue3+ts中怎么使用ref与reactive指定类型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-07-02

java中怎么使用resourcebundle读取指定文件

在Java中,可以通过`ResourceBundle`类来读取指定的文件。首先,确保指定的文件为一个属性文件(即后缀名为`.properties`)。属性文件通常是一组键值对的集合,用于存储字符串类型的数据。然后,使用`ResourceBu
2023-09-28

Java的WinProcess类怎么使用

WinProcess类是一个在Java中用来执行Windows命令的辅助类。你可以使用以下步骤来使用WinProcess类:首先,将WinProcess类导入到你的Java代码中。你可以使用以下语句导入WinProcess类:import
2023-10-22

Java的Math类怎么使用

本篇内容主要讲解“Java的Math类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的Math类怎么使用”吧!Math类包含完成基本数学函数所需的方法。这些方法分为三类:三角函数
2023-06-27

Java的Freemarker类怎么使用

本篇内容介绍了“Java的Freemarker类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、工具类public class F
2023-06-29

Java的File类怎么使用

今天小编给大家分享一下Java的File类怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述要学习Java中的Fil
2023-06-29

Java抽象类与接口怎么定义使用

这篇文章主要介绍“Java抽象类与接口怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java抽象类与接口怎么定义使用”文章能帮助大家解决问题。1.对象的比较两个对象要进行比较之前,我们首
2023-06-30

java匿名内部类怎么定义和使用

在Java中,匿名内部类是一种没有显式定义类的方式,直接在代码中创建并使用类的一种方式。匿名内部类通常用于创建只需要使用一次的类对象。匿名内部类的定义和使用步骤如下:创建一个需要使用匿名内部类的接口或者抽象类。例如,创建一个接口Greet
java匿名内部类怎么定义和使用
2024-02-29

使用java怎么指定不同长度的二维数组

本篇文章给大家分享的是有关使用java怎么指定不同长度的二维数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录