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

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

作者: 吐痰高手 | 来源:发表于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;
    }
    

    相关文章

      网友评论

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

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