`

扫描接口实现类

阅读更多

package com.fullwisdom.scan;

import java.io.File;
import java.io.IOException;
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 ClassUtils {
    /**
     *
     * @param clazz
     * @return List<Class>
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static List<Class> getInterfaceImplements(Class clazz) throws Exception{
        List<Class> retList = new ArrayList<Class>();
        try {
            Class clazzs[] = getClasses(clazz.getPackage().getName());
            int len = clazzs.length;
            for(int i=0;i<len;i++){
                if( clazz.isAssignableFrom(clazzs[i]) ){
                    if(!clazz.equals(clazzs[i]))
                        retList.add(clazzs[i]);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("加载包错误...");
        }
        return retList;
    }
   
    /**
     * 获得包下的类
     *
     * @param packageName
     *            The base package
     * @return The classes
     * @throws ClassNotFoundException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    private static Class[] getClasses(String packageName)throws ClassNotFoundException, IOException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        assert classLoader != null;
        String path = packageName.replace('.', '/');
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> dirs = new ArrayList<File>();
        ArrayList<Class> classes = new ArrayList<Class>();
        while (resources.hasMoreElements()) {
            URL resource = resources.nextElement();
            String p = "";
            if (resource.getFile().indexOf("!") >= 0) {// 在其他的jar文件中
                p = resource.getFile().substring(0,
                        resource.getFile().indexOf("!")).replaceAll("%20", "");
            } else {// 在classes目录中
                p = resource.getFile();
            }
            if (p.startsWith("file:/"))
                p = p.substring(6);
            if (p.toLowerCase().endsWith(".jar")) {
                JarFile jarFile = new JarFile(p);
                Enumeration<JarEntry> enums = jarFile.entries();
                while (enums.hasMoreElements()) {
                    JarEntry entry = (JarEntry) enums.nextElement();
                    String n = entry.getName();
                    if (n.endsWith(".class")) {
                        n = n.replaceAll("/", ".").substring(0, n.length() - 6);
                        if (n.startsWith(packageName)) {
                            classes.add(Class.forName(n));
                        }
                    }
                }
            } else {
                dirs.add(new File(p));
            }
        }
        for (File directory : dirs) {
            classes.addAll(findClasses(directory, packageName));
        }
        return classes.toArray(new Class[classes.size()]);
    }

    /**
     * 查找一个文件夹下的文件
     *
     * @param directory
     *            文价夹目录名
     * @param packageName
     *            包名
     * @return The classes
     * @throws ClassNotFoundException
     */
    @SuppressWarnings("unchecked")
    private static List<Class> findClasses(File directory, String packageName)
            throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClasses(file, packageName + "."
                        + file.getName()));
            } else if (file.getName().endsWith(".class")) {
                classes.add(Class.forName(packageName
                        + '.'
                        + file.getName().substring(0,
                                file.getName().length() - 6)));
            }
        }
        return classes;
    }
}

分享到:
评论

相关推荐

    Android Zxing 二维码扫描和生成

    zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口;可以实现使用手机的内置的摄像头完成条形码和二维码的扫描与解码;也可以实现条形码和二维码的编码与解码。

    强大的扫描工具x-scan

    然后解压到scripts目录中,实现扫描最新漏洞? A:X-Scan移植了nessus的nasl引擎,目前对应于nessus2.2.4,但不包含对本地检测脚本的支持。所 以只要是这个版本nessus支持的非本地检测脚本,都可以复制到Scripts...

    基于JAVA本地监听与远程端口扫描(源代码+论文).zip

    其他的几个类文件主要是辅助类,以及方法实现类,用来完成响应的业务操作。 3.1.2 功能大体介绍 该程序有以下功能模块: 本地监听:主要实现实时查看操作系统当前运行进程,并根据进程查看本机响应端口和远程计算机...

    SimpleFileVirusScanner:此服务提供了一个小型网页,用于上传文件并针对病毒扫描程序检查这些文件。与virustotal类似的项目,仅在使用clavav作为病毒扫描程序的开源环境中

    安装参见docs / INSTALL.md贡献/添加新的病毒扫描程序如果要添加新的病毒扫描程序,则只需实现net.ngotzmann.SimpleFileVirusScan.virusscanner.VirusScanner接口。您的病毒扫描程序bean必须是Spring管理的!将...

    JAVA本地监听与远程端口扫描(源代码+论文)

    这些操作只能通过操作系统API或者提供的接口程序运行,本次设计考虑到java本地接口和Runtime类运行操作系统自己提供的shell/命令行(windows)两种方式。 远程扫描:远程端口Java socket类与远程主机给定的端口范围...

    Deal_Noise.rar_NOISE_键盘按键扫描

    是由一组规则排列的按键组成,它主要由键开关和键扫描电路两部分组成。 2)键盘的分类 ① 按其构造原理可以分为两类: 一类是触点式开关按键,另一类是无触点开关按键; ② 从接口原理上可分为: 编码键盘和非...

    键盘及其接口电路详细介绍

    是由一组规则排列的按键组成,它主要由键开关和键扫描电路两部分组成。 2)键盘的分类 ① 按其构造原理可以分为两类: 一类是触点式开关按键,另一类是无触点开关按键; ② 从接口原理上可分为: 编码键盘和非...

    Spring模拟

    Spring模拟,可创建对象和spring ...必须在service定义dao层一个接口,那么该工具将自动在配置的扫描bean中找到该类(接口)的实现类(不必再实现类做任何记号,只需在需要实例化的对象上写个注解就好),并实例化。

    classgraph:超级快速的并行Java类路径扫描器和模块扫描器

    类图 ClassGraph是适用于Java,Scala,... 例如,Java类和反射API可以告诉您给定类的超类,或由给定类实现的接口,也可以为您提供类的批注列表。 ClassGraph可以找到扩展给定类的所有类(给定类的所有子类),或实现

    使用Java实现一个基于内存的英文全文检索搜索引擎【100012394】

    自己实现的抽象类子类和接口实现类里的关键代码必须加上注释,其中每个类、每个类里的公有方法要加上 Javadoc 注释,并自动生成 Java API 文档作为实验报告附件提交。 使用统一的测试文档集合、统一的搜索测试案例对...

    PHP微信封装类

    包括3个类,封装了微信公众账号开发接口,还有微信一对一接口,网页用微信扫描二维码实现登陆类

    基于USB接口的彩色扫描仪的优化设

    扫描仪作为一种高科技产品,被誉为计算机的“眼睛”。介绍了扫描仪的产品分类,重点阐述了一种基于USB接口的单片彩色扫描仪的工作原理及电路设计,为实现彩色扫描仪的优化设计创造了条件。

    android 开发常用工具类集合

    添加蓝牙工具类方法集、蓝牙扫描回调接口 wifi工具类添加连接指令wifi方法 2018.1.9 修复一些方法调用方式 手机工具类添加手机电量监听,添加获取本机开发这模式开关 添加测试工程 蓝牙工具类添加蓝牙工具类...

    二维码生成与扫描

    改代码是源码,下载即可直接运行,并且里面有两个非常简单的类,也是我们用时的接口类,我们只想按照他的样式实现即可做到二维码的生成和识别

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

    2.3 实现类路径 2.3.1 Entry接口 2.3.2 DirEntry 2.3.3 ZipEntry 3 2.3.4 CompositeEntry 2.3.5 WildcardEntry 2.3.6 Classpath 2.4 测试本章代码 2.5 本章小结 第3章 解析class文件 3.1 class文件 3.2 ...

    http-api-invoker:一个让http接口调用跟调用本地方法一样自然优雅的项目

    HTTP接口调用框架让 HTTP 接口调用跟调用本地方法一样自然优雅将 HTTP 请求和接口绑定,然后由框架生成接口的代理类,直接调用接口的方法就会自动构建请求参数并发送请求,然后处理请求响应转换为接口方法的返回值...

    java 对接扫码枪 工具类

    java 对接扫码枪 工具类

    DELPHI串口编程

    类別 用途 电路实现复杂性 存储器接口: 用于CPU与外部设备、存储器的连接 简单 I/O接口 数据交换 复杂 习惯上说到接口只是指I/O接口。本文沒作特別介绍的地方都叫I/O接口. 4. 为什么需要I/O接口? 计算机的外围...

    Golang实现的基于beego框架的接口在线文档管理系统.zip

    输入/输出设备:如键盘、鼠标、显示器、打印机、扫描仪、摄像头等,实现人与计算机之间的交互以及数据的输入和输出。 主板:连接和协调各硬件组件工作,包含芯片组、扩展插槽、接口等。 其他外设:如声卡、网卡、...

Global site tag (gtag.js) - Google Analytics