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;
}
网友评论