直接上代码:
package com.common.util;
import org.apache.log4j.Logger;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* Created by whuanghkl on 17/5/31.
*/
public class ClassFinder {
protected static Logger logger = Logger.getLogger(ClassFinder.class);
public static final char PKG_SEPARATOR = '.';
public static final char DIR_SEPARATOR = '/';
private static final String CLASS_FILE_SUFFIX = ".class";
private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
public static List<Class<?>> find(String scannedPackage) {
URL scannedUrl = getPackageUrl(scannedPackage);
if (scannedUrl.getPath().contains(".jar!")) {
String jarPath = scannedUrl.getPath();
jarPath = jarPath.replaceAll("\\.jar!.*$", ".jar").replace("file:", "");
System.out.println("jarPath :" + jarPath);
List<Class<?>> result = getClassesInSamePackageFromJar(scannedPackage, jarPath);
return result;
}
File scannedDir = new File(scannedUrl.getFile());
List<Class<?>> classes = new ArrayList<Class<?>>();
File[] files = scannedDir.listFiles();
if (null == files) {
logger.error("files is null,scannedPackage:" + scannedPackage);
logger.error("URL:" + scannedUrl);
return classes;
}
for (File file : files) {
classes.addAll(find(file, scannedPackage));
}
return classes;
}
/**
* Returns the list of classes in the same directories as Classes in
* classes.
*
* @param packageName
* @param jarPath : "/Users/whuanghkl/bin/http_request_tool-0.0.1-SNAPSHOT.jar"
*/
private static List<Class<?>> getClassesInSamePackageFromJar(String packageName, String jarPath) {
JarFile jarFile = null;
List<Class<?>> result = new ArrayList<>();
try {
jarFile = new JarFile(jarPath);
Enumeration<JarEntry> en = jarFile.entries();
while (en.hasMoreElements()) {
JarEntry entry = en.nextElement();
String entryName = entry.getName();
packageName = packageName.replace('.', '/');
if (entryName != null && entryName.endsWith(".class") && entryName.startsWith(packageName)) {
try {
Class entryClass = Class.forName(entryName.substring(0, entryName.length() - 6).replace('/', '.'));
if (entryClass != null) {
result.add(entryClass);
}
} catch (Throwable e) {
// do nothing, just continue processing classes
}
}
}
} catch (Exception e) {
} finally {
try {
if (jarFile != null) {
jarFile.close();
}
} catch (Exception e) {
}
}
return result;
}
public static URL getPackageUrl(String scannedPackage) {
String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR);
URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);
// System.out.println("package :" +scannedUrl.getFile());
if (scannedUrl == null) {
throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
}
return scannedUrl;
}
/***
* 获取package 的路径,例如:<br />
* /Users/whuanghkl/code/mygit/convention/src/main/webapp/WEB-INF/classes/com/girltest/dao
* @param scannedPackage
* @return
*/
public static String getPackagePath(String scannedPackage) {
URL scannedUrl = getPackageUrl(scannedPackage);
return scannedUrl.getFile();
}
private static List<Class<?>> find(File file, String scannedPackage) {
List<Class<?>> classes = new ArrayList<Class<?>>();
String resource = scannedPackage + PKG_SEPARATOR + file.getName();
if (file.isDirectory()) {
for (File child : file.listFiles()) {
classes.addAll(find(child, resource));
}
} else if (resource.endsWith(CLASS_FILE_SUFFIX)) {
int endIndex = resource.length() - CLASS_FILE_SUFFIX.length();
String className = resource.substring(0, endIndex);
try {
classes.add(Class.forName(className));
} catch (ClassNotFoundException ignore) {
}
}
return classes;
}
public static String getJavaPackage(String path) {
String classPath = path.replaceAll("^.*" + "/src/main/java/", "");//"com/common/bean/Student.java"
System.out.println("classPath :" + classPath);
//com.common.bean.Student
return classPath.replace(".java", "").replaceAll(String.valueOf(ClassFinder.DIR_SEPARATOR), String.valueOf(ClassFinder.PKG_SEPARATOR));
}
}
调用/应用:
public static void init() {
List<Class<?>> classList = ClassFinder.find("oa.entity");
if (!ValueWidget.isNullOrEmpty(classList)) {
int size = classList.size();
for (int i = 0; i < size; i++) {
Class clazz = classList.get(i);
//
JsonIgnoreTypeMapping jsonIgnoreTypeMapping = (JsonIgnoreTypeMapping) clazz.getAnnotation(JsonIgnoreTypeMapping.class);
if (null != jsonIgnoreTypeMapping) {
String[] servletPathList = jsonIgnoreTypeMapping.servletPath();
System.out.println("ClassFinder.find :" + clazz.getSimpleName());
System.out.println("ClassFinder.find :" + servletPathList[0]);
putServletClass(clazz, servletPathList);
}
}
}
}