/**
* 得到所有实现接口而且在同包下的的类
* @param aClass
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public List<Class> getImplClass(Class aClass) throws IOException, ClassNotFoundException {
List<Class> list = new ArrayList<>();
List<Class> resultList = new ArrayList<>();
String aPackage=aClass.getPackage().getName();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Enumeration<URL> enumeration =classLoader.getResources(aPackage.replaceAll("\\.","/"));
while (enumeration.hasMoreElements()) {
list.addAll(findClass(enumeration.nextElement().getPath(), aPackage));
}
for (Class c:list) {
if (isImplInterface(c) && !aClass.equals(c) && !resultList.contains(c)) {
resultList.add(c);
}
}
resultList.add(0,Class.forName("com.huawei.SysCode"));
return resultList;
}
private boolean isImplInterface(Class aClass) {
Class[] classes=aClass.getInterfaces();
for (Class c : classes) {
if(INTERFACE_CLASS.equals(c.getName()) {
return true;
}
}
return false;
}
/**
* 得到路径下所有class
* @param dir
* @param packageName
* @return
* @throws ClassNotFoundException
*/
private List<Class> findClass(String dir, String packageName) throws ClassNotFoundException {
List<Class> list = new ArrayList<>();
File f = new File(dir);
if (!f.exists()) {
return list;
}
File[] files=f.listFiles();
for (File file : files) {
if (file.isDirectory())) {
list.addAll(findClass(file.getPath(), packageName+"."+file.getName()));
}else if(file.getName().matches(".+\\.class$")){
list.add(Class.forName(packageName+"."+file.getName().replaceAll("\\.class$","")));
}
}
return list;
}