在Java中,可以通過反射機制獲取某個類的所有子類。以下是一個示例代碼:
import java.util.ArrayList;
import java.util.List;
public class SubClassExample {
public static void main(String[] args) {
List<Class<?>> subClasses = getSubClasses(MyClass.class);
for (Class<?> clazz : subClasses) {
System.out.println(clazz.getName());
}
}
public static List<Class<?>> getSubClasses(Class<?> superClass) {
List<Class<?>> subClasses = new ArrayList<>();
Package[] packages = Package.getPackages();
for (Package pkg : packages) {
String packageName = pkg.getName();
List<Class<?>> classes = getClasses(packageName);
for (Class<?> clazz : classes) {
if (superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
subClasses.add(clazz);
}
}
}
return subClasses;
}
public static List<Class<?>> getClasses(String packageName) {
List<Class<?>> classes = new ArrayList<>();
String path = packageName.replace('.', '/');
try {
String[] classPathEntries = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
for (String classpathEntry : classPathEntries) {
if (!classpathEntry.endsWith(".jar")) { // 不掃描jar包中的類
File base = new File(classpathEntry + File.separatorChar + path);
if (base.exists() && base.isDirectory()) {
File[] files = base.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".class")) {
String className = packageName + '.' + file.getName().substring(0, file.getName().length() - 6);
try {
classes.add(Class.forName(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return classes;
}
}
class MyClass {
// 父類
}
class SubClass1 extends MyClass {
// 子類1
}
class SubClass2 extends MyClass {
// 子類2
}
class SubClass3 extends MyClass {
// 子類3
}
在上面的示例中,MyClass
為父類,SubClass1
、SubClass2
和SubClass3
為子類。getSubClasses
方法會遍歷所有的類,找到所有繼承自superClass
的子類,并將其添加到一個List<Class<?>>
中返回。通過調用getSubClasses(MyClass.class)
可以獲取所有MyClass
的子類。注意,由于該方法使用了反射,可能會存在性能問題,特別是在有大量類的情況下。