`

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; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 
 
import com.cnp.andromeda.common.util.StringUtil; 
 
/**
* @Author
* @Description 包扫描器
* @CopyRight 
*/ 
public class ClassScanner{ 
    private Map<String, Class<?>> classes           = new HashMap<String, Class<?>>(); 
    private FilenameFilter        javaClassFilter;                                    // 类文件过滤器,只扫描一级类 
    private final String          CLASS_FILE_SUFFIX = ".class";                       // Java字节码文件后缀 
    private String                packPrefix;                                         // 包路径根路劲 
 
    public ClassScanner(){ 
        javaClassFilter = new FilenameFilter(){ 
            @Override 
            public boolean accept(File dir, String name){ 
                // 排除内部内 
                return !name.contains("$"); 
            } 
        }; 
    } 
 
    /**
     * @Title: scanning
     * @Description 扫描指定包(本地)
     * @param basePath 包所在的根路径
     * @param packagePath 目标包路径
     * @return Integer 被扫描到的类的数量
     * @throws ClassNotFoundException
     */ 
    public Integer scanning(String basePath, String packagePath) throws ClassNotFoundException{ 
        packPrefix = basePath; 
 
        String packTmp = packagePath.replace('.', '/'); 
        File dir = new File(basePath, packTmp); 
 
        // 不是文件夹 
        if(dir.isDirectory()){ 
            scan0(dir); 
        } 
 
        return classes.size(); 
    } 
 
    /**
     * @Title: scanning
     * @Description 扫描指定包, Jar或本地
     * @param packagePath 包路径
     * @param recursive 是否扫描子包
     * @return Integer 类数量
     */ 
    public Integer scanning(String packagePath, boolean recursive){ 
        Enumeration<URL> dir; 
        String filePackPath = packagePath.replace('.', '/'); 
        try{ 
            // 得到指定路径中所有的资源文件 
            dir = Thread.currentThread().getContextClassLoader().getResources(filePackPath); 
            packPrefix = Thread.currentThread().getContextClassLoader().getResource("").getPath(); 
            if(System.getProperty("file.separator").equals("\\")){ 
                packPrefix = packPrefix.substring(1); 
            } 
 
            // 遍历资源文件 
            while(dir.hasMoreElements()){ 
                URL url = dir.nextElement(); 
                String protocol = url.getProtocol(); 
 
                if("file".equals(protocol)){ 
                    File file = new File(url.getPath().substring(1)); 
                    scan0(file); 
                } else if("jar".equals(protocol)){ 
                    scanJ(url, recursive); 
                } 
            } 
        } 
        catch(Exception e){ 
            throw new RuntimeException(e); 
        } 
 
        return classes.size(); 
    } 
 
    /**
     * @Title: scanJ
     * @Description 扫描Jar包下所有class
     * @param url jar-url路径
     * @param recursive 是否递归遍历子包
     * @throws IOException
     * @throws ClassNotFoundException
     */ 
    private void scanJ(URL url, boolean recursive) throws IOException, ClassNotFoundException{ 
        JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection(); 
        JarFile jarFile = jarURLConnection.getJarFile(); 
 
        // 遍历Jar包 
        Enumeration<JarEntry> entries = jarFile.entries(); 
        while(entries.hasMoreElements()){ 
            JarEntry jarEntry = (JarEntry)entries.nextElement(); 
            String fileName = jarEntry.getName(); 
 
            if (jarEntry.isDirectory()) { 
                if (recursive) { 
                } 
                continue; 
            } 
             
            // .class 
            if(fileName.endsWith(CLASS_FILE_SUFFIX)){ 
                String className = fileName.substring(0, fileName.indexOf('.')).replace('/', '.'); 
                classes.put(className, Class.forName(className)); 
            } 
 
        } 
    } 
 
    /**
     * @Title: scan0
     * @Description 执行扫描
     * @param dir Java包文件夹
     * @throws ClassNotFoundException
     */ 
    private void scan0(File dir) throws ClassNotFoundException{ 
        File[] fs = dir.listFiles(javaClassFilter); 
        for(int i = 0; fs != null && i < fs.length; i++){ 
            File f = fs[i]; 
            String path = f.getAbsolutePath(); 
             
            // 跳过其他文件 
            if(path.endsWith(CLASS_FILE_SUFFIX)){ 
                String className = StringUtil.getPackageByPath(f, packPrefix); // 获取包名 
                classes.put(className, Class.forName(className)); 
            } 
        } 
    } 
 
    /**
     * @Title: getClasses
     * @Description 获取包中所有类
     * @return Map&lt;String,Class&lt;?&gt;&gt; K:类全名, V:Class字节码
     */ 
    public Map<String, Class<?>> getClasses(){ 
        return classes; 
    } 
 
    public static void main(String[] args) throws ClassNotFoundException{ 
        ClassScanner cs = new ClassScanner(); 
        int c = cs.scanning("W:/IWiFI/Code/trunk/operation/target/classes/", "com/cnp/andromeda/common/util/"); 
        System.out.println(c); 
        System.out.println(cs.getClasses().keySet()); 
 
        ClassScanner cs2 = new ClassScanner(); 
        int c2 = cs2.scanning("com.cnp.swarm", false); 
        System.out.println(c2); 
        System.out.println(cs2.getClasses().keySet()); 
    } 


2. 依赖工具类
Java代码  收藏代码
import java.io.File; 
 
/**
* @FileName: StringUtil.java
* @Author 
* @Description:
* @Date 2014年11月16日 上午10:04:03
* @CopyRight 
*/ 
 
/**
* 字符串工具类
*/ 
public final class StringUtil { 
 
    /**
     * @Title: getMethodName
     * @Description: 获取对象类型属性的get方法名
     * @param propertyName
     *            属性名
     * @return String "get"开头且参数(propertyName)值首字母大写的字符串
     */ 
    public static String convertToReflectGetMethod(String propertyName) { 
        return "get" + toFirstUpChar(propertyName); 
    } 
 
    /**
     * @Title: convertToReflectSetMethod
     * @Description: 获取对象类型属性的set方法名
     * @param propertyName
     *            属性名
     * @return String "set"开头且参数(propertyName)值首字母大写的字符串
     */ 
    public static String convertToReflectSetMethod(String propertyName) { 
        return "set" + toFirstUpChar(propertyName); 
    } 
 
    /**
     * @Title: toFirstUpChar
     * @Description: 将字符串的首字母大写
     * @param target
     *            目标字符串
     * @return String 首字母大写的字符串
     */ 
    public static String toFirstUpChar(String target) { 
        StringBuilder sb = new StringBuilder(target); 
        sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); 
        return sb.toString(); 
    } 
 
    /**
     * @Title: getFileSuffixName
     * @Description: 获取文件名后缀
     * @param fileName
     *            文件名
     * @return String 文件名后缀。如:jpg
     */ 
    public static String getFileSuffixName(String fileName) { 
        return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); 
    } 
 
    /**
     * 
     * @Title: checkStringIsNotEmpty
     * @Description:验证字符串是否不为空
     * @param stringValue
     *            传入要验证的字符串
     * @return boolean true:不为 空 或 不为null; false:值为 空 或 为null
     */ 
    public static boolean isNotEmpty(String stringValue) { 
        if (null == stringValue || "".equals(stringValue.trim())) { 
            return false; 
        } 
        return true; 
    } 
 
    /**   
     * @Title: getPackageByPath   
     * @Description 通过指定文件获取类全名  
     * @param classFile 类文件
     * @return String 类全名
     */ 
    public static String getPackageByPath(File classFile, String exclude){ 
        if(classFile == null || classFile.isDirectory()){ 
            return null; 
        } 
         
        String path = classFile.getAbsolutePath().replace('\\', '/'); 
 
        path = path.substring(path.indexOf(exclude) + exclude.length()).replace('/', '.'); 
        if(path.startsWith(".")){ 
            path = path.substring(1); 
        } 
        if(path.endsWith(".")){ 
            path = path.substring(0, path.length() - 1); 
        } 
 
        return path.substring(0, path.lastIndexOf('.')); 
    } 
分享到:
评论

相关推荐

    mybatis自动生成Java实体类和映射文件的自动生成类工具

    6. **配置文件更新**:最后,工具可能还需要更新MyBatis的主配置文件,添加新的Mapper扫描路径,确保MyBatis能够找到并加载生成的Mapper。 使用这样的自动生成工具,开发者可以将更多精力集中在业务逻辑上,而不是...

    java根据路径读出doc文件内容个人范例

    带上poi的Ex那个包,整个项目在这里,直接eclipse里面run就能读出指定路径上doc里的内容,多种方法都有,itext,poi,java2word等等,本人自己本地测试时候急忙搞的,初学不熟的就拿去看看吧,所有java提取doc的技术...

    ClassGraph-超快速超轻量级并行化的Java类路径扫描程序

    ClassGraph的核心功能是扫描Java类路径,包括JAR文件、目录和模块。它能够遍历所有的类、接口、枚举、注解等,查找指定的类或具有特定属性的类。这在处理大型项目或依赖关系时特别有用,例如在运行时检测依赖项、...

    java递归与非递归实现扫描文件夹下所有文件

    Java扫描文件夹下所有文件的应用场景非常广泛,例如,在文件管理系统中需要扫描指定文件夹下的所有文件,在搜索引擎中需要扫描指定文件夹下的所有文件,以便于快速搜索和索引文件。在实际应用中,Java扫描文件夹下...

    java读取本地.db文件实例

    在Java编程中,读取本地SQLite数据库(.db文件)是一项常见的任务,特别是在移动应用开发或者需要离线存储数据的场景下。SQLite是一种轻量级的、开源的关系型数据库,它不需要单独的服务器进程,可以直接在应用程序...

    classgraph,一个Uber快速、超轻量级Java类路径扫描器、模块扫描仪和注释处理器。.zip

    ClassGraph是一款强大的开源Java工具,它作为一个快速、超轻量级的类路径扫描器、模块扫描仪和注释处理器,广泛应用于各种Java开发场景。这个工具由Luke Daley开发,旨在提供灵活、高效且功能丰富的类扫描解决方案。...

    JAVA域名扫描程序

    1. `.classpath`:这是Eclipse IDE的一个配置文件,它包含了项目所需的类路径信息,用于编译和运行Java程序。 2. `README.md`:这是一个Markdown格式的文件,通常包含项目简介、使用方法、安装步骤等信息,是理解...

    文件服务器虚拟路径访问文件鉴权代码

    当涉及到“文件服务器虚拟路径访问文件鉴权代码”时,我们关注的是如何在Java环境下实现一个安全的系统,该系统允许用户通过虚拟路径访问文件,同时确保只有授权的用户能够进行操作,如下载。以下是对这个主题的详细...

    java扫描图片

    2. **文件I/O操作**: 使用`java.io`包中的`File`类可以获取文件路径,创建和操作文件。在扫描图片时,我们需要创建`File`对象来指定图片的路径,然后使用`exists()`检查文件是否存在,`isFile()`确认是文件而非目录...

    Java简单的文件扫描工具

    内容概要: 这段代码是一个Java小工具,名为 "FileScanner",用于递归扫描指定目录下的所有文件和文件夹,并输出文件信息,如文件名、路径、大小和最后修改时间。 适用人群: 适用于需要快速了解指定目录下文件和...

    java,OpenCV简单实现类似“全能扫描王”功能

    在Eclipse这样的集成开发环境中,我们需要将这个文件添加到项目的类路径中,或者通过系统环境变量指定路径,确保Java能够正确调用OpenCV的函数。 实现“全能扫描王”功能的关键步骤包括以下几个部分: 1. **图像...

    基于Java语言的Controller类路径扫描与入出参数结构输出设计源码

    该项目为Java语言开发的Controller类路径扫描工具,包含32个文件,涵盖24个Java源文件、2个属性文件、1个Git忽略文件、1个JAR包文件、1个Markdown文件和1个Maven构建文件。该工具能够自动扫描项目中的Controller类,...

    扫描磁盘所有文件的例子

    在实际开发中,这个过程可以用各种编程语言实现,如Python的os模块,Java的java.io.File类,或者C#的System.IO命名空间。每种语言都有其特定的方法来处理文件系统操作,但基本思路是一致的。 总的来说,扫描磁盘...

    Java扫描文件夹下所有文件名

    Java扫描文件夹下所有文件名是Java编程语言中的一种常见操作,旨在实现对指定文件夹下的所有文件进行扫描和管理。该操作在实际应用中具有重要意义,例如在文档资源管理系统中,需要扫描文件夹下的所有文件以便进行...

    遍历文件夹中的路径复制目录文件.rar

    在Java编程中,遍历文件夹中的路径并复制文件是一项常见的任务,特别是在处理大量数据或者进行文件系统操作时。这个“遍历文件夹中的路径复制目录文件.rar”压缩包可能包含了一个Java应用程序,用于实现这样的功能。...

    java 实现 JPG图像文件转换TIFF文件 有源码。有工程

    本话题主要关注的是如何使用Java来实现JPG图像文件转换为TIFF(Tagged Image File Format)文件的流程。TIFF是一种灵活的位图图像格式,广泛用于扫描、打印、光栅图像处理软件,以及在各种操作系统中使用。以下是对...

    Android下c++调用java实现内置外置sd卡MP3扫描

    本话题主要探讨如何在Android环境下,使用C++调用Java方法来扫描内置和外置SD卡上的MP3文件,并将扫描结果保存到文件中。 首先,我们需要了解Android的JNI(Java Native Interface)机制,这是Java与本地代码(如...

    Java文件管理器

    5. **多线程**:为了提升用户体验,文件操作如大文件的读写、目录扫描等通常在后台线程执行,避免阻塞主线程,这需要用到Java的并发工具类,如`ExecutorService`和`Future`。 6. **事件处理**:GUI中的按钮点击、...

    Java的包扫描实现和Jar应用.docx

    注意,`getName()`返回的是类文件的完整路径,而`substring()`和`replace()`方法则用于转换成Java中的包名和类名格式。 在给定的测试用例中,使用了一个名为`ClassScanner`的类来扫描特定包下的所有类。`...

    Java读取TIFF文件

    TIFF(Tagged Image File Format)是一种常见的图像文件格式,广泛用于专业图像编辑和扫描领域,因为它支持多种色彩模式和压缩算法。本篇文章将深入探讨如何使用Java来读取TIFF文件,并获取其尺寸——即图像的宽度...

Global site tag (gtag.js) - Google Analytics