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

private static  T getObjectByPackage(String pk, Class c) {
    T t = null;
    Set classNames = new HashSet(); // 用来保存类的完整名字
    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;
}

你可能感兴趣的:(通过反射获取指定路径下,指定接口的子类)