返回顶部
首页 > 资讯 > 精选 >使用java怎么扫描指定包下的类
  • 876
分享到

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

2023-06-14 13:06:20 876人浏览 八月长安
摘要

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

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

Java可以用来干什么

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

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怎么扫描指定包下的类

总结:这样的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怎么扫描指定包下的类,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 使用java怎么扫描指定包下的类

本文链接: https://www.lsjlt.com/news/271331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用java怎么扫描指定包下的类
    本篇文章给大家分享的是有关使用java怎么扫描指定包下的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. And...
    99+
    2023-06-14
  • java 如何扫描指定包下类(包括jar中的java类)
    在很多的实际场景中,我们需要得到某个包名下面所有的类, 包括我们自己在src里写的java类和一些第三方提供的jar包里的类,那么怎么来实现呢? 今天带大家来完成这件事。 src下面...
    99+
    2024-04-02
  • SpringBoot 在测试时如何指定包的扫描范围
    目录在测试时如何指定包的扫描范围以往…这么写通过@SpringBootApplication注解配置容器的包扫描范围配置扫描包范围如何修改包扫描的位置?方法一方法二在测试时如何指定包...
    99+
    2024-04-02
  • java如何实现一个扫描包的工具类
    小编给大家分享一下java如何实现一个扫描包的工具类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在很多的实际场景中,我们需要得到某个包名下面所有的类,比如我...
    99+
    2023-05-31
    java
  • springboot启动类怎么剔除扫描某个包
    本篇内容主要讲解“springboot启动类怎么剔除扫描某个包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot启动类怎么剔除扫描某个包”吧!启动类剔除扫描某个包排除api中不引...
    99+
    2023-06-25
  • win10扫描仪怎么使用
    要使用Windows 10中的扫描仪,您可以按照以下步骤操作:1. 连接您的扫描仪到计算机。确保扫描仪已经正确安装并连接好。2. 打...
    99+
    2023-09-09
    win10
  • 怎么使用Python-nmap网络扫描和嗅探工具包
    这篇文章将为大家详细讲解有关怎么使用Python-nmap网络扫描和嗅探工具包,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。nmap概念NMap,也称为网络映射器,最初是Linux下的网络扫...
    99+
    2023-06-02
  • 使用python怎么扫描web邮箱
    这篇文章给大家介绍使用python怎么扫描web邮箱,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。基本思路我们向工具传入目标站点之后,首先要对输入进行一个基本的检查和分析,因为我们会可能会传入各种样式的地址,比如htt...
    99+
    2023-06-14
  • QingScan扫描器怎么安装使用
    本篇内容主要讲解“QingScan扫描器怎么安装使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“QingScan扫描器怎么安装使用”吧!一、 QingScan介绍QingScan是一个安全工具...
    99+
    2023-06-22
  • C#怎么使用Twain协议实现扫描仪连续扫描功能
    本篇内容主要讲解“C#怎么使用Twain协议实现扫描仪连续扫描功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用Twain协议实现扫描仪连续扫描功能”吧!C#调用Twain接口实现扫...
    99+
    2023-06-26
  • php漏洞扫描工具怎么使用
    使用php漏洞扫描工具的步骤如下:1. 下载和安装php漏洞扫描工具,例如:OWASP ZAP、Netsparker等。2. 打开漏...
    99+
    2023-06-08
    php漏洞扫描工具 php
  • Linux的nmap扫描端口命令怎么使用
    本篇内容介绍了“Linux的nmap扫描端口命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!nmap扫描端口命令是“nmap -s...
    99+
    2023-07-04
  • Java中怎么利用Swagger配置扫描接口
    本篇文章为大家展示了Java中怎么利用Swagger配置扫描接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. Swagger--配置扫描接口及开关1.1 配置扫描接口SwaggerConfig...
    99+
    2023-06-20
  • Ubuntu系统下怎么安装和使用网络扫描工具Zenmap
    本篇内容主要讲解“Ubuntu系统下怎么安装和使用网络扫描工具Zenmap”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu系统下怎么安装和使用网络扫描工具Zenmap”吧!Zenmap...
    99+
    2023-06-13
  • Maven打包时怎么指定启动类
    这篇“Maven打包时怎么指定启动类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Maven打包时怎么指定启动类”文章吧。M...
    99+
    2023-07-05
  • Springboot怎么使用maven打包指定mainClass
    这篇“Springboot怎么使用maven打包指定mainClass”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri...
    99+
    2023-07-06
  • Spring之@ComponentScan自动扫描组件怎么使用
    这篇文章主要讲解了“Spring之@ComponentScan自动扫描组件怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring之@ComponentScan自动扫描组件怎么使用...
    99+
    2023-07-02
  • java同一个包下的类怎么互相调用
    在同一个包下的类可以直接互相调用,不需要使用任何关键字或语法来指明调用关系。只需在需要调用的方法前面加上类名即可。例如,假设有两个类...
    99+
    2023-08-20
    java
  • 使用vbs怎么复制指定文件到指定目录下
    这篇文章给大家介绍使用vbs怎么复制指定文件到指定目录下,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。核心代码Set fso=CreateObject("Scripting.filesystemob...
    99+
    2023-06-08
  • java中怎么使用filewriter指定编码
    在Java中,可以使用FileWriter来指定编码。下面是一个示例代码:```javaimport java.io.FileWri...
    99+
    2023-09-29
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作