首页>代码>Jfinal开发农副产品电子商城系统,完整前后台系统>/JFinalShop/JFinalShop/src/main/java/com/cms/ClassScaner.java
package com.cms;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import com.jfinal.kit.PathKit;
import com.jfinal.log.Log;

public class ClassScaner {

	private static final Log log = Log.getLog(ClassScaner.class);

	public static <T extends Annotation> List<Class<T>> scanAnnotationClass(Class<T> annotationClass) {
		if (annotationClass == null) {
			log.error("annotationClass: annotationClass is null");
			return null;
		}

		List<File> classFileList = new ArrayList<File>();
		scanClass(classFileList, PathKit.getRootClassPath());

		List<Class<T>> classList = new ArrayList<Class<T>>();
		for (File file : classFileList) {

			int start = PathKit.getRootClassPath().length();
			int end = file.toString().length() - 6; // 6 == ".class".length();

			String classFile = file.toString().substring(start + 1, end);
			Class<T> clazz = classForName(classFile.replace(File.separator, "."));
			
			if (clazz != null && clazz.getAnnotation(annotationClass)!=null) {
				classList.add(clazz);
			}
		}
		return classList;
	}
	
	public static <T> List<Class<T>> scanSubClass(Class<T> pclazz, boolean mustbeCanNewInstance,boolean scanLib) {
		if (pclazz == null) {
			log.error("scanClass: parent clazz is null");
			return null;
		}
		List<File> classFileList = new ArrayList<File>();
		scanClass(classFileList, PathKit.getRootClassPath());

		List<Class<T>> classList = new ArrayList<Class<T>>();
		for (File file : classFileList) {

			int start = PathKit.getRootClassPath().length();
			int end = file.toString().length() - 6; // 6 == ".class".length();

			String classFile = file.toString().substring(start + 1, end);
			Class<T> clazz = classForName(classFile.replace(File.separator, "."));

			if (clazz != null && pclazz.isAssignableFrom(clazz)) {
				if (mustbeCanNewInstance) {
					if (clazz.isInterface())
						continue;

					if (Modifier.isAbstract(clazz.getModifiers()))
						continue;
				}
				classList.add(clazz);
			}
		}
		//扫描lib目录
		if(scanLib){
			File jarsDir = new File(PathKit.getWebRootPath() + "/WEB-INF/lib");
			if (jarsDir.exists() && jarsDir.isDirectory()) {
				File[] jarFiles = jarsDir.listFiles(new FileFilter() {
					@Override
					public boolean accept(File pathname) {
						String name = pathname.getName().toLowerCase();
						return name.endsWith(".jar") && name.startsWith("jpress");
					}
				});
				
				if (jarFiles != null && jarFiles.length > 0) {
					for (File f : jarFiles) {
						try {
							classList.addAll(scanSubClass(pclazz, new JarFile(f), mustbeCanNewInstance));
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}

		return classList;
	}

	public static <T> List<Class<T>> scanSubClass(Class<T> pclazz, JarFile jarFile, boolean mustbeCanNewInstance) {
		if (pclazz == null) {
			log.error("scanClass: parent clazz is null");
			return null;
		}

		List<Class<T>> classList = new ArrayList<Class<T>>();
		Enumeration<JarEntry> entries = jarFile.entries();

		while (entries.hasMoreElements()) {
			JarEntry jarEntry = entries.nextElement();
			String entryName = jarEntry.getName();
			if (!jarEntry.isDirectory() && entryName.endsWith(".class")) {
//				String className = entryName.replace(File.separator, ".").substring(0, entryName.length() - 6);
				String className = entryName.replace("/", ".").substring(0, entryName.length() - 6);
				Class<T> clazz = classForName(className);
				if (clazz != null && pclazz.isAssignableFrom(clazz)) {
					if (mustbeCanNewInstance) {
						if (clazz.isInterface())
							continue;

						if (Modifier.isAbstract(clazz.getModifiers()))
							continue;
					}
					classList.add(clazz);
				}
			}
		}

		try {
			jarFile.close();
		} catch (IOException e) {
			log.error("jarFile.close is error",e);
		}

		return classList;
	}

	@SuppressWarnings("unchecked")
	private static <T> Class<T> classForName(String className) {
		Class<T> clazz = null;
		try {
			ClassLoader cl = Thread.currentThread().getContextClassLoader();
			clazz = (Class<T>) Class.forName(className, false, cl);
		} catch (Throwable e) {
			log.error("classForName is error,className:"+className);
		}
		return clazz;
	}

	private static void scanClass(List<File> fileList, String path) {
		File files[] = new File(path).listFiles();
		if (null == files || files.length == 0)
			return;
		for (File file : files) {
			if (file.isDirectory()) {
				scanClass(fileList, file.getAbsolutePath());
			} else if (file.getName().endsWith(".class")) {
				fileList.add(file);
			}
		}
	}

}
最近下载更多
wkq888  LV17 4月9日
qingsj  LV6 2023年3月2日
Shanice 37  LV3 2022年11月14日
FF加菲猫  LV4 2022年11月3日
1986王志飞  LV6 2022年8月12日
微信网友_5968037137092608  LV2 2022年5月21日
fmyyy11  LV2 2022年5月20日
lzlzyw  LV14 2022年3月25日
TomBruce  LV3 2022年2月19日
MarkLee 琥珀川  LV13 2022年1月25日
最近浏览更多
wkq888  LV17 4月9日
biakuya  LV2 1月4日
Daima000  LV4 2024年12月3日
zolscy  LV24 2024年11月29日
17558420274  LV16 2024年9月15日
krispeng  LV15 2024年9月15日
yuzhiyun  LV4 2024年8月30日
grant1123  LV2 2024年6月22日
gidfsgs 2024年6月3日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友