根据接口名字查询系统中所有的实现类
2015-02-06 17:36
393 查看
package com.ykp.factorymethodpattern; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * @function:给一个接口,返回这个接口的所有实现类的工具类 * @author yankunpeng * @date 2015-2-6下午03:13:43 * @mailto yan095650@163.com */ @SuppressWarnings("all") public class ClassUtils { /** * @function: 查询某个接口的所有实现类 * @param c * 接口的class * @param rootPackageList * 项目中根包的集合,也就是包名的最上级,如com,cn等等,要视具体项目而定 * @return List<Class> 满足条件的类集合 * @author yankunpeng * @date 2015-2-6下午04:08:10 * @mailto yan095650@163.com */ public static List<Class> getAllClassByInterface(Class c, List<String> rootPackageList) { List<Class> returnClassList = new ArrayList<Class>(); // 如果不是一个接口,则不做处理 if (c.isInterface()) { try { List<Class> allClass = getClasses(rootPackageList); for (int i = 0; i < allClass.size(); i++) { // Class.isAssignableFrom()是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的子类或接口。 if ((!allClass.get(i).isInterface())// 是否是类 && (c.isAssignableFrom(allClass.get(i)))// 是否实现了同一个接口 && (!c.equals(allClass.get(i)))) {// 不是本身 returnClassList.add(allClass.get(i)); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return returnClassList; } /** * @function:查找包内的所有类和接口 * @param rootPackageList * 项目中根包的集合,也就是包名的最上级,如com,cn等等,要视具体项目而定 * @return List<Class> 满足条件的类集合 * @throws ClassNotFoundException * @throws IOException * @author yankunpeng * @date 2015-2-6下午05:15:09 * @mailto yan095650@163.com */ private static List<Class> getClasses(List<String> rootPackageList) throws ClassNotFoundException, IOException { ArrayList<Class> classes = new ArrayList<Class>(); ClassLoader classLoader = Thread.currentThread() .getContextClassLoader(); for (String packageName : rootPackageList) { String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<File>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } for (File directory : dirs) { classes.addAll(findClasses(directory, packageName)); } } return classes; } /** * @function:查找制定路径下的.class文件 * @param directory * 路径 * @param packageName * 包名 * @return List<Class> 满足条件的类集合 * @throws ClassNotFoundException * @author yankunpeng * @date 2015-2-6下午05:17:12 * @mailto yan095650@163.com */ private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException { List<Class> classes = new ArrayList<Class>(); if (!directory.exists()) { return classes; } File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { classes.addAll(findClasses(file, packageName + "." + file.getName())); } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); } } return classes; } public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("com"); list.add("cn"); System.out.println(getAllClassByInterface(Human.class, list)); } }
相关文章推荐
- python实现根据主机名字获得所有ip地址的方法
- 实现功能要求统计图书的总价,编写方法查询出在50元以上的所有图书,使用排序接口图书按照价格排序(升序排序)
- python实现根据主机名字获得所有ip地址的方法
- Java根据包名获取指定接口的所有实现
- 根据系统表查询用户方案下所有对象信息的用例语句
- AngularJS实现购物车模糊查询,价格区间查找,根据名字删除,点击排序
- Java实现根据ou名次查询该ou下的所有用户,或者按照名称模糊查询
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- 《设计模式之禅》中根据一个接口查找所有实现类
- (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 急!查询所有用户两次登录的时间间隔小于5分钟的所有记录,能用自连接实现吗?
- ATM系统实现[3]——余额查询窗口[00原创]
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- ASP.NET域名查询系统源代码,域名Whois查询,(.Com/.Net/.Org/.Cn),c#语言实现域名Whois信息查询
- 线程注入 根据进程名字来实现注入
- ABAP--如何实现交货单的任何一item库位发生人工修改时系统自动更新所有items(感谢天元提供)
- 文本行查询系统[6]-系统用户接口的实现
- 文本行查询系统[5]-业务逻辑查询类的实现
- ABAP--如何实现交货单的任何一item库位发生人工修改时系统自动更新所有items(感谢天元提供)
- Intel Flash的驱动实现及提供给文件系统Flash File System的一些接口