java 获取某一个包下的所有class 包括jar包中的文件

public class ClassUtil {
	private static Logger log = Logger.getLogger(ClassUtil.class);

	public static List<Class<?>> getClasses(String packageName)
			throws ClassNotFoundException, IOException {

		ClassLoader classLoader = Thread.currentThread()
				.getContextClassLoader();
		String path = packageName.replace(".", "/");
		log.info("path:" + path);
		Enumeration<URL> resources = classLoader.getResources(path);
		log.info("获取资源路径" + resources);
		ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
		while (resources.hasMoreElements()) {
			log.info("resources.hasMoreElements()");
			URL resource = resources.nextElement();
			log.info(resource.getProtocol());
			log.info(resource.getPath());

			String protocol = resource.getProtocol();

			if ("file".equals(protocol)) {
				File file = new File(resource.getFile());
				classes.addAll(findClasses(file, packageName));
			} else if ("jar".equals(protocol)) {
				System.out.println("jar类型的扫描");
				String jarpath = resource.getPath();
				jarpath = jarpath.replace("file:/", "");
				jarpath = jarpath.substring(0, jarpath.indexOf("!"));
				return getClasssFromJarFile(jarpath, path);
			}

		}
		return classes;
	}

	private static List<Class<?>> findClasses(File directory, String packageName)
			throws ClassNotFoundException {
		log.info("directory.exists()=" + directory.exists());
		log.info("directory.getName()=" + directory.getName());
		ArrayList<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;

	}

	/**
	 * 从jar文件中读取指定目录下面的所有的class文件
	 * 
	 * @param jarPaht
	 *            jar文件存放的位置
	 * @param filePaht
	 *            指定的文件目录
	 * @return 所有的的class的对象
	 */
	public static List<Class<?>> getClasssFromJarFile(String jarPaht,
			String filePaht) {
		List<Class<?>> clazzs = new ArrayList<Class<?>>();

		JarFile jarFile = null;
		try {
			jarFile = new JarFile(jarPaht);

			List<JarEntry> jarEntryList = new ArrayList<JarEntry>();

			Enumeration<JarEntry> ee = jarFile.entries();
			while (ee.hasMoreElements()) {
				JarEntry entry = (JarEntry) ee.nextElement();
				// 过滤我们出满足我们需求的东西
				if (entry.getName().startsWith(filePaht)
						&& entry.getName().endsWith(".class")) {
					jarEntryList.add(entry);
				}
			}
			for (JarEntry entry : jarEntryList) {
				String className = entry.getName().replace('/', '.');
				className = className.substring(0, className.length() - 6);

				try {
					clazzs.add(Thread.currentThread().getContextClassLoader()
							.loadClass(className));
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e1) {
			log.error("解析jar包文件异常");
		} finally {
			if (null != jarFile) {
				try {
					jarFile.close();
				} catch (Exception e) {
				}

			}
		}
		return clazzs;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值