`

扫描接口实现类

阅读更多

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;
    }
}

分享到:
评论

相关推荐

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

    它支持扫描特定的包、类、接口、注解等,同时还可以查找依赖关系和资源文件。这种能力在诸如元数据提取、插件发现、配置自动生成、测试框架等领域非常有用。 二、模块扫描 随着Java 9引入的模块系统,ClassGraph也...

    java扫描仪接口调用源码

    在Java中,通常会创建一个Scanner类来封装扫描仪的接口调用,包括设置扫描参数(如分辨率、色彩模式等)、启动扫描、获取扫描图像等方法。这些方法通过JNI或JNA与扫描仪驱动进行交互。 其次,描述中提到需要在...

    Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 Java 中动态获取实现某个接口下所有的实现类对象集合是一个常见的需求,特别是在基于接口编程的开发模式中。这篇文章将向大家分享如何使用 Java 反射机制和第三方...

    Honeywell MX7T 扫描枪接口API及Demo

    霍利韦尔为开发者提供了一个名为“LXE MX7T”的API开发接口类库,该接口库包含了一个DLL动态链接库文件。DLL文件是Windows操作系统中的一种共享库,它封装了扫描枪的各种操作功能,如启动扫描、接收扫描数据、设置...

    JAVA获取同一路径下所有子类或接口实现类

    - `Intf`是示例中的接口,`Man`是它的实现类。`isAssignableFrom()`方法用于检查`Class`对象表示的类或接口是否可以被`cls`表示的类或接口赋值。如果`Man`是`Intf`的实现,则`Intf.isAssignableFrom(Man.class)`...

    Android中Webview与原生界面交互及二维码扫描功能实现

    本项目"Android中Webview与原生界面交互及二维码扫描功能实现"就是一个很好的示例,展示了如何在Android应用中集成WebView并结合二维码扫描功能。 首先,我们要理解WebView的基本用法。WebView是Android SDK中的一...

    spring注解识别一个接口的多个实现类方法

    2. **接口实现** 接下来,我们可以创建多个实现`Filter`接口的类。例如,`TimeFilter`是一个实现了`Filter`接口的类,它对传入的参数进行特定的处理。 ```java @Service("timeFilter") public class TimeFilter ...

    dephi开发扫描仪接口

    在软件开发中,接口通常指的是用于通信的协议或类,使得不同组件之间能够协同工作。在扫描仪的上下文中,接口是指软件与扫描仪硬件之间的桥梁,它允许程序发送命令来控制扫描过程,如启动扫描、设置扫描参数等。 ...

    扫描头接口说明1

    在Android开发中,当涉及到与硬件设备如扫描头交互时,通常需要使用特定的库和接口来实现。本文将详细讲解如何使用名为"ReaderManager"的接口,它主要用于控制和配置扫描头的功能。 首先,为了在项目中使用扫描头...

    c语言接口与实现

    3. **数据结构封装**:C语言虽然没有像面向对象语言那样的类,但可以通过结构体来封装数据,并提供一组操作这些数据的函数,实现类似面向对象的封装特性。这种封装可以隐藏数据的具体实现细节,只通过接口暴露必要的...

    C# 扫描扫描源代码

    在C#中,开发者可以使用System.Drawing命名空间下的类,如Bitmap和Image,来处理扫描得到的图像。对于TWAIN扫描,可以使用第三方库如TwainDotNet,它封装了TWAIN接口,提供易于使用的C# API。而对于WIA,可以使用...

    Android二维码实现扫描生成

    生成二维码相对简单,主要涉及`Writer`接口和`BitMatrix`类。首先,选择合适的`Writer`实现,例如`QRCodeWriter`,它负责编码数据为二维码的二进制矩阵。然后,使用`encode`方法,输入要编码的数据和格式,得到`...

    自己用的DAO实现类

    DAO接口定义了对数据库进行操作的方法,而DAO实现类则具体实现了这些方法,执行SQL语句,处理结果集等。 在本压缩包中,只有一个名为"dao"的文件,可能是包含了一个或多个DAO实现类的Java源代码文件。这些类通常会...

    Java重定义接口实现代码的自动注入.pdf

    4. **框架设计**:构建一个框架,负责扫描注解、解析接口变化,并在合适的时机执行字节码注入,将新方法的实现自动插入到已有的实现类中。 通过这种方式,Java程序员可以更灵活地应对需求变化,无需担心接口修改对...

    扫描二维码下载 JAVA实现20190403

    本文将深入探讨如何使用JAVA实现扫描二维码自动下载对应客户端类型的APP功能。 首先,我们需要理解二维码的基本原理。二维码(Quick Response Code)是一种二维条形码,存储的数据可以是网址、文字、图片、联系人...

    java实现电脑端扫描二维码

    在Java中实现电脑端扫描二维码的过程涉及到多个步骤,包括前端的图像捕获、后端的图像处理和解码。以下是对这些步骤的详细说明: 1. **前端图像捕获**: - 前端使用JavaScript来调用电脑摄像头进行拍照。这通常...

    QT实现端口扫描

    本项目利用QT实现了一个端口扫描器,结合了端口遍历、网段扫描以及多线程技术,提高了扫描效率。 首先,我们来理解端口扫描的基本原理。端口是计算机网络中的通信通道,每个端口都有一个编号,范围是从0到65535。...

    扫描显示类

    在扫描过程中,类可能会实现一个或多个方法来与扫描仪硬件交互。这通常涉及到使用WIA(Windows Image Acquisition)或TWAIN接口,这两个是常见的扫描仪驱动标准。WIA是Windows操作系统内置的,适合较新的扫描仪;而...

    Android监听扫描枪设备自带扫描键DemoT

    在Android开发中,有时我们需要集成硬件设备,如扫描枪,以实现快速的条形码或二维码读取功能。"Android监听扫描枪设备自带扫描键DemoT"是一个针对此类需求的示例项目,它展示了如何在Android应用中监听并处理扫描枪...

Global site tag (gtag.js) - Google Analytics