实现实现Java可以通过反射机制获取指定类的所有子类,提供一个示例代码:
实现
Java可以通过反射机制获取指定类的所有子类,提供一个示例代码:
java
public static List> getAllSubClass(Class> superClass) {
List> subCl = new ArrayList<>();
// 获取当前线程的类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String packageName = superClass.getPackage().getName();
try {
// 获取指定包名下的所有类
Enumeration dirs = classLoader.getResources(packageName.replace(".", "/"));
while (dirs.hasMoreElements()) {
URL url = dirs.nextElement();
String protocol = url.getProtocol();
if ("file".equals(protocol)) {
// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
findAndAddSubClInPackageByFile(packageName, filePath, subCl, superClass);
} else if ("jar".equals(protocol)) {
JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile();
Enumeration entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
if (name.charAt(0) == '/') {
name = name.substring(1);
}
if (name.startsWith(packageName.replace(".", "/"))) {
int idx = name.lastIndexOf('/');
if (idx != -1) {
packageName = name.substring(0, idx).replace("/", ".");
}
if (name.endsWith(".class") && !entry.isDirectory()) {
String className = name.substring(packageName.length() + 1, name.length() - 6);
try {
Class> clazz = Class.forName(packageName + '.' + className);
if (superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
subCl.add(clazz);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return subCl;
}
/**
* 在package对应的路径下找到所有的class
*/
public static void findAndAddSubClInPackageByFile(String packageName, String packagePath, List> subCl, Class> superClass) {
File dir = new File(packagePath);
if (!dir.exists() || !dir.isDirectory()) {
return;
}
File[] files = dir.listFiles(file -> (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory());
assert files != null;
for (File file : files) {
String fileName = file.getName();
if (file.isFile()) {
String className = fileName.substring(0, fileName.length() - 6);
try {
Class> clazz = Class.forName(packageName + '.' + className);
if (superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
subCl.add(cl
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(61条)