java中包的扫描
包括自己的包和jar中的包
public abstract class PackageScanner {
public abstract void dealClass(Class<?> klass);
private boolean isClass(Class<?> klass) {
if (klass.isAnnotation()
|| klass.isInterface()
|| klass.isEnum()
|| klass.isPrimitive()) {
return false;
}
return true;
}
//自己编写的包的处理
private void scanPackage(String packageName, File currentFile) {
//过滤器
File[] fileList = currentFile.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return true;
}
return pathname.getName().endsWith(".class");
}
});
for (File file : fileList) {
if (file.isDirectory()) {
scanPackage(packageName + "." + file.getName(), file);
} else {
String fileName = file.getName().replace(".class", "");
String className = packageName + "." + fileName;
try {
//反射类
Class<?> klass = Class.forName(className);
//去掉是接口,注解等类
if (!isClass(klass)) {
continue;
}
//处理类
dealClass(klass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
//jar包中的包的处理方法
private void scanPackage(URL url) throws IOException {
JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = urlConnection.getJarFile();
Enumeration<JarEntry> jarEntries = jarFile.entries();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
String jarEntryName = jarEntry.getName();
//判断本文件是否依然为文件
if (jarEntry.isDirectory() || !jarEntryName.endsWith(".class")) {
continue;
} else {
try {
String klassName = jarEntryName.replace(".class", "").replace("/", ".");
//反射这个类
Class<?> klass = Class.forName(klassName);
//去掉是接口,注解等类
if(!isClass(klass)) {
continue;
}
//处理类
dealClass(klass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
public void packageScan(String packageName) {
String packageOppositePath = packageName.replace(".", "/");
ClassLoader classLoder = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resource;
try {
resource = classLoder.getResources(packageOppositePath);
//遍历本包中的所有文件
while (resource.hasMoreElements()) {
URL url = resource.nextElement();
//判断是否为jar包中的包名称
if (url.getProtocol().equals("jar")) {
scanPackage(url);
} else {
File file = new File(url.toURI());
if (!file.exists()) {
continue;
}
scanPackage(packageName, file);
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}