java获取包中的所有类_java下获取当前包中所有的类的代码

import java.io.File;

import java.io.FileFilter;

import java.lang.annotation.Annotation;

import java.net.JarURLConnection;

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;

public class ClassUtil {

// 获取指定包名下的所有类

public static List> getClassList(String packageName, boolean isRecursive) {

List> classList = new ArrayList>();

try {

Enumeration urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("\\.", "/"));

while (urls.hasMoreElements()) {

URL url = urls.nextElement();

if (url != null) {

String protocol = url.getProtocol();

if (protocol.equals("file")) {

String packagePath = url.getPath();

addClass(classList, packagePath, packageName, isRecursive);

} else if (protocol.equals("jar")) {

JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();

JarFile jarFile = jarURLConnection.getJarFile();

Enumeration jarEntries = jarFile.entries();

while (jarEntries.hasMoreElements()) {

JarEntry jarEntry = jarEntries.nextElement();

String jarEntryName = jarEntry.getName();

if (jarEntryName.endsWith(".class")) {

String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");

if (isRecursive || className.substring(0, className.lastIndexOf(".")).equals(packageName)) {

classList.add(Class.forName(className));

}

}

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

return classList;

}

// 获取指定包名下的所有类(可根据注解进行过滤)

public static List> getClassListByAnnotation(String packageName, Class extends Annotation> annotationClass) {

List> classList = new ArrayList>();

try {

Enumeration urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("\\.", "/"));

while (urls.hasMoreElements()) {

URL url = urls.nextElement();

if (url != null) {

String protocol = url.getProtocol();

if (protocol.equals("file")) {

String packagePath = url.getPath();

addClassByAnnotation(classList, packagePath, packageName, annotationClass);

} else if (protocol.equals("jar")) {

JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();

JarFile jarFile = jarURLConnection.getJarFile();

Enumeration jarEntries = jarFile.entries();

while (jarEntries.hasMoreElements()) {

JarEntry jarEntry = jarEntries.nextElement();

String jarEntryName = jarEntry.getName();

if (jarEntryName.endsWith(".class")) {

String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");

Class> cls = Class.forName(className);

if (cls.isAnnotationPresent(annotationClass)) {

classList.add(cls);

}

}

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

return classList;

}

private static void addClass(List> classList, String packagePath, String packageName, boolean isRecursive) {

try {

File[] files = getClassFiles(packagePath);

if (files != null) {

for (File file : files) {

String fileName = file.getName();

if (file.isFile()) {

String className = getClassName(packageName, fileName);

classList.add(Class.forName(className));

} else {

if (isRecursive) {

String subPackagePath = getSubPackagePath(packagePath, fileName);

String subPackageName = getSubPackageName(packageName, fileName);

addClass(classList, subPackagePath, subPackageName, isRecursive);

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

private static File[] getClassFiles(String packagePath) {

return new File(packagePath).listFiles(new FileFilter() {

@Override

public boolean accept(File file) {

return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();

}

});

}

private static String getClassName(String packageName, String fileName) {

String className = fileName.substring(0, fileName.lastIndexOf("."));

if (StringUtil.isNotEmpty(packageName)) {

className = packageName + "." + className;

}

return className;

}


版权声明:本文为weixin_35698659原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。