常用代码备忘录-ClassUtil.java
2013-09-24 14:04
411 查看
public class ClassUtil { // 获取指定包名下的所有类 public static List<Class<?>> getClassList(String packageName, boolean isRecursive) { List<Class<?>> classList = new ArrayList<Class<?>>(); try { Enumeration<URL> 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<JarEntry> 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<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) { List<Class<?>> classList = new ArrayList<Class<?>>(); try { Enumeration<URL> 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<JarEntry> 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; } // 获取指定包名下指定父类的所有类 public static List<Class<?>> getClassListBySuper(String packageName, Class<?> superClass) { List<Class<?>> classList = new ArrayList<Class<?>>(); try { Enumeration<URL> 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(); addClassBySuper(classList, packagePath, packageName, superClass); } else if (protocol.equals("jar")) { JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); JarFile jarFile = jarURLConnection.getJarFile(); Enumeration<JarEntry> 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 (superClass.isAssignableFrom(cls) && !superClass.equals(cls)) { classList.add(cls); } } } } } } } catch (Exception e) { e.printStackTrace(); } return classList; } // 获取指定包名下指定接口的所有实现类 public static List<Class<?>> getClassListByInterface(String packageName, Class<?> interfaceClass) { List<Class<?>> classList = new ArrayList<Class<?>>(); try { Enumeration<URL> 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(); addClassByInterface(classList, packagePath, packageName, interfaceClass); } else if (protocol.equals("jar")) { JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); JarFile jarFile = jarURLConnection.getJarFile(); Enumeration<JarEntry> 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 (interfaceClass.isAssignableFrom(cls) && !interfaceClass.equals(cls)) { classList.add(cls); } } } } } } } catch (Exception e) { e.printStackTrace(); } return classList; } private static void addClass(List<Class<?>> 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; } private static String getSubPackagePath(String packagePath, String filePath) { String subPackagePath = filePath; if (StringUtil.isNotEmpty(packagePath)) { subPackagePath = packagePath + "/" + subPackagePath; } return subPackagePath; } private static String getSubPackageName(String packageName, String filePath) { String subPackageName = filePath; if (StringUtil.isNotEmpty(packageName)) { subPackageName = packageName + "." + subPackageName; } return subPackageName; } private static void addClassByAnnotation(List<Class<?>> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) { try { File[] files = getClassFiles(packagePath); if (files != null) { for (File file : files) { String fileName = file.getName(); if (file.isFile()) { String className = getClassName(packageName, fileName); Class<?> cls = Class.forName(className); if (cls.isAnnotationPresent(annotationClass)) { classList.add(cls); } } else { String subPackagePath = getSubPackagePath(packagePath, fileName); String subPackageName = getSubPackageName(packageName, fileName); addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass); } } } } catch (Exception e) { e.printStackTrace(); } } private static void addClassBySuper(List<Class<?>> classList, String packagePath, String packageName, Class<?> superClass) { try { File[] files = getClassFiles(packagePath); if (files != null) { for (File file : files) { String fileName = file.getName(); if (file.isFile()) { String className = getClassName(packageName, fileName); Class<?> cls = Class.forName(className); if (superClass.isAssignableFrom(cls) && !superClass.equals(cls)) { classList.add(cls); } } else { String subPackagePath = getSubPackagePath(packagePath, fileName); String subPackageName = getSubPackageName(packageName, fileName); addClassBySuper(classList, subPackagePath, subPackageName, superClass); } } } } catch (Exception e) { e.printStackTrace(); } } private static void addClassByInterface(List<Class<?>> classList, String packagePath, String packageName, Class<?> interfaceClass) { try { File[] files = getClassFiles(packagePath); if (files != null) { for (File file : files) { String fileName = file.getName(); if (file.isFile()) { String className = getClassName(packageName, fileName); Class<?> cls = Class.forName(className); if (interfaceClass.isAssignableFrom(cls) && !interfaceClass.equals(cls)) { classList.add(cls); } } else { String subPackagePath = getSubPackagePath(packagePath, fileName); String subPackageName = getSubPackageName(packageName, fileName); addClassByInterface(classList, subPackagePath, subPackageName, interfaceClass); } } } } catch (Exception e) { e.printStackTrace(); } } }
相关文章推荐
- 常用代码备忘录-DbUtil.java
- ClassUtil.java代码解读
- 常用代码备忘录-DBHelper.java
- 常用代码备忘录-SQLHelper.java
- 常用代码备忘录(封装 Apache Commons 的 DbUtils 实现的数据库操作工具类)-DBUtil.java
- java常用代码
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(3) - 聚合
- java常用字符串处理实例代码
- org.apache.jasper.JasperException: java.lang.ClassCastException: org.apache.catalina.util.DefaultAnn
- java.lang.NoClassDefFoundError: Could not initialize class com.zzxgy.struts.model.HibernateUtil
- java.util.concurrent 包下常用的类
- [总结]基于Java的Spark、DF、RDD常用代码
- Java util之常用数据类型特性盘点
- 【Ibatis】(十一)、java.util.Map作为parameterClass和resultClass
- Java核心代码(十)日志log4j,java.util.logging,commons-logging
- java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener错误解决方案
- java的常用函数代码
- java常用代码架构示例
- java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcesso
- hbase Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.ThreadFactoryBu