美文网首页
通过反射获取指定路径下,指定接口的子类

通过反射获取指定路径下,指定接口的子类

作者: 吐痰高手 | 来源:发表于2017-11-08 22:15 被阅读8次
private static <T> T getObjectByPackage(String pk, Class<?> c) {
    T t = null;
    Set<String> classNames = new HashSet<String>(); // 用来保存类的完整名字
    ClassLoader loader = Thread.currentThread().getContextClassLoader(); // 类加载器
    String packagePath = pk.replace(".", "/"); // 将包名转化为路径

    URL url = loader.getResource(packagePath); // 获取classpath下的packagePath目录的url表示
    // 查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。
    // 资源名称是以 '/' 分隔的标识资源的路径名称。

    if (url != null) {
        // 去除中文路径
        File file = null;
        try {
            file = new File(URLDecoder.decode(url.getPath(), "UTF-8")); // 获取类所在的目录
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (file != null) {
            File[] fs = file.listFiles();

            for (File f : fs) { // 遍历这个包
                if (f.isFile()) {
                    String fileName = f.getName();
                    // 把所有类文件的完整类名 放入集合中, 不包括各种内部类
                    if (fileName.endsWith(".class")
                            && !fileName.contains("$")) {
                        classNames.add(pk + "."
                                + fileName.replace(".class", ""));
                    }
                }
            }
        }
    }
    //遍历这个路径,找到指定类的子类并返回
    for (String string : classNames) {
        try {
            Class c1 = Class.forName(string);
            if (c.isAssignableFrom(c1)) // 通过反射查询判断的这个类c1是否是c的子类
            {
                t = (T) c1.newInstance();
                return t;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return t;
}

相关文章

  • 通过反射获取指定路径下,指定接口的子类

  • Java笔记——注释(Annotation)

    Annotation 是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,通过Annotio...

  • Java基础-注解

    一、Annotation的概念   Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Ann...

  • python文件相关处理

    批量修改文件名 获取指定路径下的所有文件路径

  • 文件,文件夹操作

    获取用户文档目录路径 对指定路径执行浅搜索,返回指定目录路径下的文件、子目录及符号链接的列表 类似上面的,对指定路...

  • iOS FileManager 文件及文件夹处理

    FileManager 1. 获取用户文档目录路径 2. 搜索 对指定路径执行浅搜索,返回指定目录路径下的文件、子...

  • 自定义注解的使用

    自定义注解的使用 一、注解是什么 Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Anno...

  • 20170714 基本Annotation

    参考文献:《Java疯狂讲义》(第三版) 知识点:Annotation是一个接口,程序可以通过反射来获取指定程序元...

  • 【MyBatis】sql执行流程

    在【MyBatis】Spring整合原理中说到通过扫描指定的mapper包路径下的所有接口都会使用getSqlSe...

  • api

    目录 1. 查询指定项目属性接口 *** **1. 查询指定项目属性** ###### 接口功能 > 获取制定项目...

网友评论

      本文标题:通过反射获取指定路径下,指定接口的子类

      本文链接:https://www.haomeiwen.com/subject/igrumxtx.html