`

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('.')); 
    } 
分享到:
评论

相关推荐

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

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

    java读取本地.db文件实例

    java读取本地.db文件简单方法,sqlite数据库类型文件获取数据

    Java简单的文件扫描工具

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

    奇安信安全扫描漏洞解决路径遍历和存储型xss和反射xss攻击漏洞

    亲测可用,中级漏洞,解决服务器段请求伪造 final String forURL = ESAPI.encoder().encodeForURL(url); restTemplate.exchange(forURL, HttpMethod.GET,new HttpEntity&lt;String&gt;(headers), List.class, params);

    采用递归的方式把某个目录下所有以 .java结尾的文件的绝对路径给输出在控制台

    把E:\digui-print目录下所有的java结尾的文件的绝对路径给输出在控制台

    自动拷贝class等文件

    介绍下这个打包工具 把本次你改动的java工程下的文件对应的class文件自动打包,然后热部署发布即可 如果你需要频繁改动java代码,热发布几个文件到服务器上,你会怎么做呢? 没有工具的人会手动拷贝目录 然后到...

    获取目录下文件路径信息写入Excel并打包上传远程服务器

    最近在练习go代码,恰好工作中有一些场景需要经常去访问某个目录下所有文件,将相对路径写入Excel并上传系统,同时打包文件上传服务器。利用工作之余,练练手学习写了一个小工具,主要实现功能如下: 获取指定目录...

    java自动打包工具

    另外还有自动扫描功能,不想手动找路径,那使用自动扫描吧,选个时间点,这个时间点后的所有文件都被找出来了 此工具还可以结合svn cvs版本控制软件使用;更大力度上节省你的时间 另外请在本地环境配置下java_home

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    奇安信代码卫士,文件上传漏洞解决demo

    (1)上传文件应保存在指定路径下。 (2)对上传文件进行随机数重命名,避免文件被覆盖。 (3)设置上传文件路径, 使用户不能轻易访问自己上传的文件 。 (4) 文件应尽量保存在内容服务器或web目录外部,避免通过...

    自己动手写Java虚拟机 张秀宏 著

    高清非扫描版 带目录 SBN:978-7-111-53413-6 目录 前言 第1章 命令行工具 1.1 准备工作 1.1.1 安装JDK 1.1.2 安装Go 1.1.3 创建目录结构 1.2 java命令 1.3 编写命令行工具 1.4 测试本章代码 1.5 本章小结 ...

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    corejava源码-core:一个高级且高度优化的Java库,用于构建框架:它对扫描类路径,在运行时生成类,促进使用反射,扫描文件系统,执行

    Core在8至17-ea的Java版本上进行了测试,它是一个完全独立,高级,免费和开放源代码的Java框架构建库,它对于扫描类路径,在运行时生成类,促进使用反射,扫描非常有用。文件系统,执行字符串化的源代码等等。 ...

    java本科毕业设计_从业人员在线培训系统源代码.zip

    修改相关路径,配置正确的图片路径、文件路径、附件路径、Mapper扫描路径。 修改所有application.properties文件中的Nacos服务,使用自己的Nacos服务地址和端口 修改所有application.properties文件中的Redis服务,...

    Java读取word文档内容并输出成网页(含图片,公式)

    本代码实现使用Java程序读取word文档成网页,将word文档按原样在网页输出。项目编码为UTF-8,文件编码也是utf8,再不要说乱码这种骚话了,选择utf8加载项目就不会乱码

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

Global site tag (gtag.js) - Google Analytics