`

ClassUtils

    博客分类:
  • java
 
阅读更多
package test;

import inter.TestInter;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class ClassUtils {
	// 给一个接口,返回这个接口的所有实现类
	public static List<Class<?>> getAllClassByInterface(Class<?> c) {
		List<Class<?>> returnClassList = new ArrayList<Class<?>>(); // 返回结果
		// 如果不是一个接口,则不做处理
		if (c.isInterface()) {
			String packageName = c.getPackage().getName();          // 获得当前的包名
			try {
				List<Class<?>> allClass = getClasses(packageName);  // 获得当前包下以

				// 判断是否是同一个接口
				for (int i = 0; i < allClass.size(); i++) {
					if (c.isAssignableFrom(allClass.get(i))) {      // 判断是不是一个接口
						if (!c.equals(allClass.get(i))) {           // 本身不加进去
							returnClassList.add(allClass.get(i));
						}
					}
				}
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return returnClassList;
	}

	// 从一个包中查找出所有的类,在jar包中不能查找
	private static List<Class<?>> getClasses(String packageName) throws ClassNotFoundException, IOException {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		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()));
		}
		ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
		for (File directory : dirs) {
			classes.addAll(findClasses(directory, packageName));
		}
		return classes;
	}

	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()) {
				assert !file.getName().contains(".");
				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) throws Exception{
		// 查找一个包下面的所有类
		List<Class<?>> classes = getClasses("com.test");
		for(int i=0;i<classes.size();i++){
			System.out.println(classes.get(i).getName());
		}
		
		System.out.println("--------------------------------");
		
		// 查找一个接口的所有实现类
		List<Class<?>> impls = getAllClassByInterface(TestInter.class);
		for(int i=0;i<impls.size();i++){
			System.out.println(impls.get(i).getName());
		}
	}
}
分享到:
评论

相关推荐

    java组件开发(9)ClassUtils

    java组件开发(9)ClassUtils

    commons.lang3.ClassUtils 源码中文注释

    org.apache.commons.lang3.ClassUtils 源码中文注释,之后会加上其他的工具类注释,方便以后复习阅读

    Python库 | classutils-1.15.3-py2.py3-none-any.whl

    在Python的世界里,`classutils`是一个特定的库,版本为1.15.3,它是一个适用于Python 2和Python 3的库(由文件名`py2.py3-none-any`部分所示)。`classutils`库主要关注类(class)相关的功能,旨在简化面向对象...

    Python库 | classutils-1.10.1-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:classutils-1.10.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    org.apache.commons.lang jar包下载(commons-lang3-3.1.jar)

    org.apache.commons.lang.ClassUtils.class org.apache.commons.lang.Entities$ArrayEntityMap.class org.apache.commons.lang.Entities$BinaryEntityMap.class org.apache.commons.lang.Entities$EntityMap....

    commons-lang-utils

    ClassUtils是关于Java反射的工具类,它提供了获取类信息、比较类、转换类以及执行方法等能力。例如,`forName()`方法可以安全地加载类,`isAssignable()`可以判断一个类是否可以赋值给另一个类,`getAllInterfaces()...

    utils工具集合.zip

    9. **对象工具**:如ClassUtils、ReflectionUtils等,可以帮助处理类、对象的反射操作,以及类型转换等。 10. **编码解码工具**:Base64编码、URL编码解码等,是网络传输中常见的需求,相关的工具类可以提供便利。 ...

    Java字符串加密使用的一个jar包 commons-lang3-3.1.jar下载

    Java字符串加密使用到的一个jar包 commons-lang3-3.1...org.apache.commons.lang3.ClassUtils.class org.apache.commons.lang3.Validate.class org.apache.commons.lang3.SystemUtils.class 。。。。。。。。。。。。。

    模块的力量:Ruby中include与extend的深度解析

    `class_method`可以直接通过类调用,而`extended`方法则会在`ClassUtils`模块被扩展时自动调用。 #### `include` 与 `extend` 的区别 虽然`include`和`extend`都可以用于集成模块的功能,但它们在使用场景上有明显...

    java utils 工具类

    此外,还有一些其他常见的工具类,如`NumberUtils`用于数字操作,`ReflectionUtils`提供了反射相关的辅助方法,`ClassUtils`可以帮助处理类的加载和转换。 在实际开发中,合理利用这些工具类可以提高代码的可读性和...

    扫描接口实现类

    在Java中,`ClassUtils`通常是一个工具类,用于处理与类相关的操作,如加载类、检查类是否存在、获取类的属性和方法等。在给定的`ClassUtils.java`文件中,可能会包含以下功能: 1. **类加载**:`Class.forName...

    Java简单模拟ATM机项目

    CheckBalance.class LoginAction.class ModifyPsw.class TransferAccountsAction.class UpdateBalance.class domin CardInfo.class start Login.class UI CheckBalanceUI$...

    commons-lang-2.0.zip

    `ArrayUtils`可以进行数组的边界检查和转换操作,`ClassUtils`则简化了类和接口的检查及转换,而`DateUtils`则提供了对日期和时间的操作,包括格式化、比较和计算等。 在服务器端,这些工具类极大地提高了代码的...

    commons-lang3-3.5源码1

    Lang 3.5中广泛应用了设计模式,如工厂模式(如`ClassUtils.getClass()`)、单例模式(如`NullArgumentException`)以及装饰器模式(如`StringUtils`中的各种静态方法)。 3. **异常处理** Lang 3.5在处理可能抛...

    基于YMP框架实现的简单HTTP请求透传代理模块.rar

    YMP v2.0.6 发布了!本次版本更新主要新增若干新特性并针对一些已知问题进行修复及性能优化。 为了让YMP框架能够在Android环境中使用,本次更新...[新增] 为ClassUtils类新增通过读取META-INF/services/路径下与类名称

    看例子练apache_commons之lang篇

    `ClassUtils` 类提供了一系列用于处理类的方法,如获取类名、类的简单名称等。 - **ClassUtils.getShortClassName()**: 获取类的简短名称(不包含包名)。 - **ClassUtils.isAssignable()**: 判断一个类是否可以被...

Global site tag (gtag.js) - Google Analytics