1. 扫描类
class="java">import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import com.cnp.andromeda.common.util.StringUtil; /** * @Author * @Description 包扫描器 * @CopyRight */ public class ClassScanner{ private Map<String, Class<?>> classes = new HashMap<String, Class<?>>(); private FilenameFilter javaClassFilter; // 类文件过滤器,只扫描一级类 private final String CLASS_FILE_SUFFIX = ".class"; // Java字节码文件后缀 private String packPrefix; // 包路径根路劲 public ClassScanner(){ javaClassFilter = new FilenameFilter(){ @Override public boolean accept(File dir, String name){ // 排除内部内 return !name.contains("$"); } }; } /** * @Title: scanning * @Description 扫描指定包(本地) * @param basePath 包所在的根路径 * @param packagePath 目标包路径 * @return Integer 被扫描到的类的数量 * @throws ClassNotFoundException */ public Integer scanning(String basePath, String packagePath) throws ClassNotFoundException{ packPrefix = basePath; String packTmp = packagePath.replace('.', '/'); File dir = new File(basePath, packTmp); // 不是文件夹 if(dir.isDirectory()){ scan0(dir); } return classes.size(); } /** * @Title: scanning * @Description 扫描指定包, Jar或本地 * @param packagePath 包路径 * @param recursive 是否扫描子包 * @return Integer 类数量 */ public Integer scanning(String packagePath, boolean recursive){ Enumeration<URL> dir; String filePackPath = packagePath.replace('.', '/'); try{ // 得到指定路径中所有的资源文件 dir = Thread.currentThread().getContextClassLoader().getResources(filePackPath); packPrefix = Thread.currentThread().getContextClassLoader().getResource("").getPath(); if(System.getProperty("file.separator").equals("\\")){ packPrefix = packPrefix.substring(1); } // 遍历资源文件 while(dir.hasMoreElements()){ URL url = dir.nextElement(); String protocol = url.getProtocol(); if("file".equals(protocol)){ File file = new File(url.getPath().substring(1)); scan0(file); } else if("jar".equals(protocol)){ scanJ(url, recursive); } } } catch(Exception e){ throw new RuntimeException(e); } return classes.size(); } /** * @Title: scanJ * @Description 扫描Jar包下所有class * @param url jar-url路径 * @param recursive 是否递归遍历子包 * @throws IOException * @throws ClassNotFoundException */ private void scanJ(URL url, boolean recursive) throws IOException, ClassNotFoundException{ JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection(); JarFile jarFile = jarURLConnection.getJarFile(); // 遍历Jar包 Enumeration<JarEntry> entries = jarFile.entries(); while(entries.hasMoreElements()){ JarEntry jarEntry = (JarEntry)entries.nextElement(); String fileName = jarEntry.getName(); if (jarEntry.isDirectory()) { if (recursive) { } continue; } // .class if(fileName.endsWith(CLASS_FILE_SUFFIX)){ String className = fileName.substring(0, fileName.indexOf('.')).replace('/', '.'); classes.put(className, Class.forName(className)); } } } /** * @Title: scan0 * @Description 执行扫描 * @param dir Java包文件夹 * @throws ClassNotFoundException */ private void scan0(File dir) throws ClassNotFoundException{ File[] fs = dir.listFiles(javaClassFilter); for(int i = 0; fs != null && i < fs.length; i++){ File f = fs[i]; String path = f.getAbsolutePath(); // 跳过其他文件 if(path.endsWith(CLASS_FILE_SUFFIX)){ String className = StringUtil.getPackageByPath(f, packPrefix); // 获取包名 classes.put(className, Class.forName(className)); } } } /** * @Title: getClasses * @Description 获取包中所有类 * @return Map<String,Class<?>> K:类全名, V:Class字节码 */ public Map<String, Class<?>> getClasses(){ return classes; } public static void main(String[] args) throws ClassNotFoundException{ ClassScanner cs = new ClassScanner(); int c = cs.scanning("W:/IWiFI/Code/trunk/operation/target/classes/", "com/cnp/andromeda/common/util/"); System.out.println(c); System.out.println(cs.getClasses().keySet()); ClassScanner cs2 = new ClassScanner(); int c2 = cs2.scanning("com.cnp.swarm", false); System.out.println(c2); System.out.println(cs2.getClasses().keySet()); } }
?
2. 依赖工具类
import java.io.File; /** * @FileName: StringUtil.java * @Author * @Description: * @Date 2014年11月16日 上午10:04:03 * @CopyRight */ /** * 字符串工具类 */ public final class StringUtil { /** * @Title: getMethodName * @Description: 获取对象类型属性的get方法名 * @param propertyName * 属性名 * @return String "get"开头且参数(propertyName)值首字母大写的字符串 */ public static String convertToReflectGetMethod(String propertyName) { return "get" + toFirstUpChar(propertyName); } /** * @Title: convertToReflectSetMethod * @Description: 获取对象类型属性的set方法名 * @param propertyName * 属性名 * @return String "set"开头且参数(propertyName)值首字母大写的字符串 */ public static String convertToReflectSetMethod(String propertyName) { return "set" + toFirstUpChar(propertyName); } /** * @Title: toFirstUpChar * @Description: 将字符串的首字母大写 * @param target * 目标字符串 * @return String 首字母大写的字符串 */ public static String toFirstUpChar(String target) { StringBuilder sb = new StringBuilder(target); sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); return sb.toString(); } /** * @Title: getFileSuffixName * @Description: 获取文件名后缀 * @param fileName * 文件名 * @return String 文件名后缀。如:jpg */ public static String getFileSuffixName(String fileName) { return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); } /** * * @Title: checkStringIsNotEmpty * @Description:验证字符串是否不为空 * @param stringValue * 传入要验证的字符串 * @return boolean true:不为 空 或 不为null; false:值为 空 或 为null */ public static boolean isNotEmpty(String stringValue) { if (null == stringValue || "".equals(stringValue.trim())) { return false; } return true; } /** * @Title: getPackageByPath * @Description 通过指定文件获取类全名 * @param classFile 类文件 * @return String 类全名 */ public static String getPackageByPath(File classFile, String exclude){ if(classFile == null || classFile.isDirectory()){ return null; } String path = classFile.getAbsolutePath().replace('\\', '/'); path = path.substring(path.indexOf(exclude) + exclude.length()).replace('/', '.'); if(path.startsWith(".")){ path = path.substring(1); } if(path.endsWith(".")){ path = path.substring(0, path.length() - 1); } return path.substring(0, path.lastIndexOf('.')); } }
?