根據父類獲取同一個包(包括子包)下所有子類
阿新 • • 發佈:2019-02-17
宣告:文章內容全都是自己的學習總結,如有不對的地方請大家幫忙指出。有需要溝通交流的可加我QQ群:425120333
Java語言的三大特性是繼承、封裝、多型。繼承指的是子類通過關鍵字extends繼承父類、或者是implements實現介面。不管是
繼承父類還是實現介面,子類和父類都是建立了聯絡。這裡提供了一個根據父類的類資訊獲取同一個包下的所有子類的資訊,
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* @author 頑石的堅持
* @date 2017年4月27日
* @introduce:根據父類的類檔案獲取所以的子類類檔案集合,要求父類和子類在同一個包中,或者子類在子包中
*/
public class ClassUtil {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static List<Class> getSonClass(Class fatherClass) {
List<Class> sonClassList = new ArrayList<Class>();
String packageName = fatherClass.getPackage().getName();
List<Class> packageClassList = getPackageClass(packageName);
for (Class clazz : packageClassList) {
if (fatherClass.isAssignableFrom(clazz) && !fatherClass.equals(clazz)) {
sonClassList.add(clazz);
}
}
return sonClassList;
}
@SuppressWarnings({ "rawtypes" })
private static List<Class> getPackageClass(String packageName) {
ClassLoader loader = ClassUtil.class.getClassLoader();
String path = packageName.replace(".", "/");
Enumeration<URL> resources = null;
try {
resources = loader.getResources(path);
} catch (IOException e) {
e.printStackTrace();
}
List<File> fileList = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
fileList.add(new File(resource.getFile()));
}
ArrayList<Class> classList = new ArrayList<Class>();
for (File file : fileList) {
classList.addAll(findClass(file, packageName));
}
return classList;
}
@SuppressWarnings({ "rawtypes" })
private static List<Class> findClass(File file, String packageName) {
List<Class> classList = new ArrayList<Class>();
if (!file.exists()) {
return classList;
}
File[] fileArray = file.listFiles();
for (File subFile : fileArray) {
if (subFile.isDirectory()) {
assert !file.getName().contains(".");
classList.addAll(findClass(subFile, packageName + "." + subFile.getName()));
} else if (subFile.getName().endsWith(".class")) {
try {
classList.add(Class.forName(packageName + "." + subFile.getName().split(".class")[0]));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
return classList;
}
}