首页>代码>基于Jfinal权限工作流管理系统>/epoch-erp/src/main/java/com/epoch/platform/base/component/annotation/ClassSearcher.java
                
                package com.epoch.platform.base.component.annotation;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import com.epoch.platform.base.component.util.PathUtils;
import com.jfinal.kit.PathKit;
public class ClassSearcher {
	
	static String classPathUrl = PathKit.getWebRootPath();
	static String lib = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + "lib";
	public static <T> List<Class<? extends T>> findInClasspathAndJars(Class<T> clazz, List<String> includeJars) {
		List<String> classFileList = findFiles(classPathUrl, "*.class");
		classFileList.addAll(findjarFiles(lib, includeJars));
		return extraction(clazz, classFileList);
	}
	public static <T> List<Class<? extends T>> findInClasspath(Class<T> clazz) {
		List<String> classFileList = findFiles(classPathUrl, "*.class");
		return extraction(clazz, classFileList);
	}
	/**
	 * 递归查找文件
	 * 
	 * @param baseDirName
	 *            查找的文件夹路径
	 * @param targetFileName
	 *            需要查找的文件名
	 */
	private static List<String> findFiles(String baseDirName, String targetFileName) {
		/**
		 * 算法简述: 从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件,
		 * 若为文件,则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。 队列不空,重复上述操作,队列为空,程序结束,返回结果。
		 */
		List<String> classFiles = new ArrayList<String>();
		String tempName = null;
		// 判断目录是否存在
		File baseDir = new File(baseDirName);
		if (!baseDir.exists() || !baseDir.isDirectory()) {
			System.err.println("search error:" + baseDirName + " is not a dir!");
		} else {
			String[] filelist = baseDir.list();
			for (int i = 0; i < filelist.length; i++) {
				File readfile = new File(baseDirName + File.separator + filelist[i]);
				if (readfile.isDirectory()) {
					classFiles.addAll(findFiles(baseDirName + File.separator + filelist[i], targetFileName));
				} else {	
					tempName = readfile.getName();
					if (wildcardMatch(targetFileName, tempName)) {
						String classname = "";
						String tem = readfile.getAbsoluteFile().toString().replaceAll("\\\\", "/");;
						String[] rootClassPath = new String[] { //
						"/classes" // java web
								, "/test-classes" // maven test
								, "/bin" // java project
						};
						// scan class,set root path
						for (int j = 0; j < rootClassPath.length; j++) {
							String tmp = rootClassPath[j];
							if (tem.indexOf(tmp) >= 0) {
								classname = tem.substring(tem.indexOf(tmp) + tmp.length(), tem.indexOf(".class"));
								break;
							}
						}
						if (classname.startsWith("/")) {
							classname = classname.substring(classname.indexOf("/") + 1);
						}
						classname = className(classname, "/classes");
						classFiles.add(classname);
					}
				}
			}
		}
		return classFiles;
	}
	/**
	 * 查找jar包中的class
	 * 
	 * @param baseDirName
	 *            jar路径
	 * @param includeJars
	 * @param jarFileURL
	 *            jar文件地址 <a href="http://my.oschina.net/u/556800"
	 *            target="_blank" rel="nofollow">@return</a>
	 */
	public static List<String> findjarFiles(String baseDirName, final List<String> includeJars) {
		List<String> classFiles = new ArrayList<String>();
		try {
			// 判断目录是否存在
			File baseDir = new File(baseDirName);
			if (!baseDir.exists() || !baseDir.isDirectory()) {
				System.out.println("####warn####file serach error:" + baseDirName + " is not a dir!");
			} else {
				String[] filelist = baseDir.list(new FilenameFilter() {
					public boolean accept(File dir, String name) {
						return includeJars.contains(name);
					}
				});
				for (int i = 0; i < filelist.length; i++) {
					JarFile localJarFile = new JarFile(new File(baseDirName + File.separator + filelist[i]));
					Enumeration<JarEntry> entries = localJarFile.entries();
					while (entries.hasMoreElements()) {
						JarEntry jarEntry = entries.nextElement();
						String entryName = jarEntry.getName();
						if (!jarEntry.isDirectory() && entryName.endsWith(".class")) {
							String className = entryName.replaceAll("/", ".").substring(0, entryName.length() - 6);
							classFiles.add(className);
						}
					}
					localJarFile.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return classFiles;
	}
	@SuppressWarnings("unchecked")
	private static <T> List<Class<? extends T>> extraction(Class<T> clazz, List<String> classFileList) {
		List<Class<? extends T>> classList = new ArrayList<Class<? extends T>>();
		for (String classFile : classFileList) {
			Class<?> classInFile = null;
			try {
				classInFile = Class.forName(classFile);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			if (clazz.isAssignableFrom(classInFile) && clazz != classInFile) {
				classList.add((Class<? extends T>) classInFile);
			}
		}
		return classList;
	}
	private static String className(String classFile, String pre) {
		String objStr = PathUtils.rebuild(classFile);
		return objStr.replaceAll("/", ".");
	}
	/**
	 * 通配符匹配
	 * 
	 * @param pattern
	 *            通配符模式
	 * @param str
	 *            待匹配的字符串 <a href="http://my.oschina.net/u/556800"
	 *            target="_blank" rel="nofollow">@return</a>
	 *            匹配成功则返回true,否则返回false
	 */
	private static boolean wildcardMatch(String pattern, String str) {
		int patternLength = pattern.length();
		int strLength = str.length();
		int strIndex = 0;
		char ch;
		for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {
			ch = pattern.charAt(patternIndex);
			if (ch == '*') {
				// 通配符星号*表示可以匹配任意多个字符
				while (strIndex < strLength) {
					if (wildcardMatch(pattern.substring(patternIndex + 1), str.substring(strIndex))) {
						return true;
					}
					strIndex++;
				}
			} else if (ch == '?') {
				// 通配符问号?表示匹配任意一个字符
				strIndex++;
				if (strIndex > strLength) {
					// 表示str中已经没有字符匹配?了。
					return false;
				}
			} else {
				if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {
					return false;
				}
				strIndex++;
			}
		}
		return strIndex == strLength;
	}
}
最近下载更多
                
                wubz2008     LV5
                2024年4月22日
            
            
        
                pfb123456     LV8
                2022年11月14日
            
            
        
                xindong     LV12
                2022年6月24日
            
            
        
                bluesky2016     LV15
                2022年6月10日
            
            
        
                xqyedu     LV3
                2022年6月10日
            
            
        
                wanglinddad     LV55
                2022年5月29日
            
            
        
                liangc09     LV2
                2022年4月28日
            
            
        
                liuzejuncn     LV6
                2022年3月27日
            
            
        
                刘亦菲9527     LV15
                2022年2月14日
            
            
        
                yangctz     LV25
                2022年1月11日
            
            
        
最近浏览更多
                
                微信网友_6956978011000832     LV2
                6月30日
            
            
        
                sunqing971     LV2
                1月18日
            
            
        
                CrystalQ     LV8
                2024年8月15日
            
            
        
                myfz0662     LV10
                2024年5月8日
            
            
        
                cityhunter     LV5
                2024年4月22日
            
            
        
                wubz2008     LV5
                2024年4月22日
            
            
        
                微信网友_6906962132258816     LV7
                2024年4月21日
            
            
        
                490154865    
                2024年3月4日
            
            
                    暂无贡献等级
            
        
                1049066887     LV13
                2024年3月3日
            
            
        
                dmy2008     LV6
                2023年12月27日
            
            
        
                
    
                