获取子类
package com.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ClassLoaderUtil {
public synchronized static void loadClassesFromPath(String specPath) {
if (!isLoad) {
try {
URL resource = ClassLoaderUtil.class.getResource(specPath);
URI uri = resource.toURI();
if(String.valueOf(uri).indexOf("jar!")>0){
resource = ClassLoaderUtil.class.getProtectionDomain().getCodeSource().getLocation();
uri = resource.toURI();
}
String property = new File(uri).getPath();
String[] paths = property.split(";");
for (String path : paths) {
File file = new File(path);
if (file.isFile() && path.endsWith(".jar")) {
listClassesInZip(file,specPath);
} else if (file.isDirectory()) {
listClassesInDirectory(path.substring(0,path.length()-specPath.length()) + File.separatorChar, file);
}
}
} catch (URISyntaxException e) {
// JOptionPane.showMessageDialog(null, ExceptionUtil.getExceptionMessage(e));
}
}
}
private synchronized static void listClassesInDirectory(String rootPath, File file) {
File[] subFiles = file.listFiles();
for (File subFile : subFiles) {
if (subFile.canRead()) {
if (subFile.isFile()) {
String path = subFile.getPath();
if (path.endsWith(".class")) {
try {
String className = getClassName(path.substring(rootPath.length()));
CLASSES.add(Class.forName(className));
} catch (Throwable e) {
}
} else if (path.endsWith(".jar")) {
listClassesInZip(subFile,"/");
}
} else if (subFile.isDirectory()) {
listClassesInDirectory(rootPath, subFile);
}
}
}
}
private synchronized static void listClassesInZip(File jarFile,String specPath) {
ZipInputStream in = null;
try {
in = new ZipInputStream(new FileInputStream(jarFile));
ZipEntry ze = null;
while ((ze = in.getNextEntry()) != null) {
if (ze.isDirectory()) {
continue;
} else {
try {
String name = ze.getName();
if (!name.endsWith(".class"))
continue;
if(specPath.substring(1).length()>0 && name.indexOf(specPath.substring(1))<0)
continue;
String className = getClassName(name);
CLASSES.add(Class.forName(className));
} catch (Throwable e) {
}
}
}
} catch (Throwable e) {
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
private static String getClassName(String path) {
return path.replace('/', '.').replace('\\', '.').replaceAll(".class", "");
}
public static List<Class<?>> getSubClasses(Class<?> clazz) {
List<Class<?>> subClasses = SUB_CLASSES_MAP.get(clazz);
if (subClasses == null) {
subClasses = new ArrayList<Class<?>>(10);
for (Class<?> tmpClass : CLASSES) {
if (clazz.isAssignableFrom(tmpClass) && !tmpClass.isAssignableFrom(clazz)) {
subClasses.add(tmpClass);
}
}
SUB_CLASSES_MAP.put(clazz, subClasses);
}
return Collections.unmodifiableList(subClasses);
}
public static final List<Class<?>> CLASSES = new ArrayList<Class<?>>(200);
private static final Map<Class<?>, List<Class<?>>> SUB_CLASSES_MAP = new HashMap<Class<?>, List<Class<?>>>();
private static boolean isLoad;
}