`
supben
  • 浏览: 329172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 扫包

    博客分类:
  • JVM
 
阅读更多
package com.supben.main;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class Scanner {

	// 文件分隔符"\"
	private static final String FILE_SEPARATOR = File.separator;
	// package扩展名分隔符
	private static final String PACKAGE_SEPARATOR = ".";
	// java类文件的扩展名
	private static final String CLASS_FILE_EXT = ".class";
	// jar类文件的扩展名
	private static final String JAR_FILE_EXT = ".jar";
	// 应用程序classPath,形如D:/Workspaces/aop/WebRoot/WEB-INF/classes/
	private static final String APP_CLASS_PATH = Scanner.class.getClassLoader().getResource("").getPath().substring(1);

	/**
	 * 获取项目的所有classpath ,包括 APP_CLASS_PATH 和所有的jar文件
	 */
	private static Set<String> getAllClassPath() throws Exception {
		Set<String> set = new LinkedHashSet<String>();
		URL[] urlAry = ((URLClassLoader) Thread.currentThread().getContextClassLoader()).getURLs();
		for (URL url : urlAry) {
			set.add(url.getPath());
		}
		return set;
	}

	/**
	 * 获取文件下的所有文件(递归)
	 */
	private static Set<File> getAllFiles(File file) {
		Set<File> files = new LinkedHashSet<File>();
		if (!file.isDirectory()) {
			files.add(file);
		} else {
			File[] subFiles = file.listFiles();
			for (File f : subFiles) {
				files.addAll(getAllFiles(f));
			}
		}
		return files;
	}

	/**
	 * 获取文件下的所有.class文件
	 */
	private static Set<File> getAllClass(File file) {
		// 获取所有文件
		Set<File> files = getAllFiles(file);
		Set<File> classes = new LinkedHashSet<File>();
		// 只保留.class 文件
		for (File f : files) {
			if (f.getName().endsWith(CLASS_FILE_EXT)) {
				classes.add(f);
			}
		}
		return classes;
	}

	/**
	 * 得到文件夹下所有class的全包名
	 */
	private static Set<String> getClassNameFromDir(File file) {
		Set<File> files = getAllClass(file);
		Set<String> names = new LinkedHashSet<String>();
		for (File f : files) {
			String fname = f.getAbsolutePath();
			// 下面的代码是把形如D:/Workspaces/aop/WebRoot/WEB-INF/classes/com/supben/main/Scanner.class
			// 的文件名转化成com.supben.main.Scanner,即去掉头部的APP_CLASS_PATH,和尾部的CLASS_FILE_EXT,再将"/"换成"."
			int begin = APP_CLASS_PATH.length();
			int end = fname.indexOf(CLASS_FILE_EXT);
			String tmpName = fname.substring(begin, end);
			names.add(tmpName.replace(FILE_SEPARATOR, PACKAGE_SEPARATOR));
		}
		return names;
	}

	/**
	 * 获取jar文件里的所有class文件名
	 */
	private static Set<String> getClassNameFromJar(JarFile jarFile) throws Exception {
		Enumeration entries = jarFile.entries();
		Set<String> classes = new LinkedHashSet<String>();
		while (entries.hasMoreElements()) {
			JarEntry entry = (JarEntry) entries.nextElement();
			String name = entry.getName();
			if (name.endsWith(CLASS_FILE_EXT)) {
				int end = name.indexOf(CLASS_FILE_EXT);
				String tmpName = name.substring(0, end);
				classes.add(tmpName.replace("/", PACKAGE_SEPARATOR));
			}
		}
		return classes;
	}

	/**
	 * 扫描 工程下的所有类,不包括jar文件中的类
	 */
	public static void scan() throws Exception {
		Set<String> allclassPath = getAllClassPath();
		for (String path : allclassPath) {
			System.out.println("打印项目自写class列表开始--------------------------------");
			Set<String> classes = getClassNameFromDir(new File(APP_CLASS_PATH));
			for (String s : classes) {
				System.out.println(s);
			}

			System.out.println("打印jar里边class列表开始--------------------------------");
			if (path.endsWith(JAR_FILE_EXT)) {
				Set<String> jarclasses = getClassNameFromJar(new JarFile(new File(path.substring(1))));
				for (String s : jarclasses) {
					System.out.println(s);
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		scan();
		System.out.println(System.currentTimeMillis() - begin);
	}
}
0
1
分享到:
评论

相关推荐

    java usb扫码枪数据

    Java USB扫码枪数据的处理是将物理设备与Java应用程序相结合,实现数据的自动读取和解析。在这个项目中,我们有一个名为"ReadCodeWeb"的DEMO,它是一个基于WEB的应用,专门设计用来配合外置的扫码枪进行二维码或条形...

    java 对接扫码枪 工具类

    在Java开发中,对接扫码枪是一项常见的任务,特别是在零售、仓储和物流等领域。扫码枪能够快速读取条形码或二维码的信息,将其转化为数字信号,然后由计算机处理。本篇文章将详细讲解如何在Java中创建一个工具类来...

    扫码枪微信支付当面付 JAVA demo 案例示例

    这个Java demo案例是专门为实现扫码枪与微信支付的集成而设计的,它提供了一个完整的流程示例,帮助开发者快速理解和实现这一功能。 1. **扫码枪技术原理**: 扫码枪通过读取条形码或二维码,将其中的信息转化为...

    java实现扫一扫封装的工具类

    在Java编程语言中,"扫一扫"功能通常是指二维码或条形码扫描,广泛应用于移动应用、支付场景等。为了实现这一功能,我们需要了解几个关键知识点: 1. **二维码与条形码**: 二维码(Quick Response Code)是一种二维...

    java支付包扫码支付以及配置参数说明

    以下是对Java支付包扫码支付以及`zfbinfo.properties`配置文件的详细说明。 1. **Java支付宝SDK**: - Java支付宝SDK是支付宝提供给开发者用于集成其支付服务的库。它包含了处理支付请求、验证回调结果等功能的类...

    java检测并自动获取usb扫码枪设备输入

    在Java编程环境中,为了在Windows 7或XP(32位和64位)系统下检测并自动获取USB扫码枪设备输入,我们需要实现一个能够监听USB设备连接,并处理扫码枪扫描到的条形码数据的解决方案。这个过程涉及到几个关键的技术点...

    Java,Springboot,QQ扫码登录,主要是用于开发网页版页面qq扫码登录

    标题中提到的"Java,Springboot,QQ扫码登录",意味着我们将使用Java语言,结合Spring Boot框架,实现一个能够支持QQ扫码登录的功能。这涉及到以下几个核心步骤: 1. **配置OAuth2.0**:QQ登录采用OAuth2.0授权协议...

    java源码 钉钉扫码登陆 示例源码 2018127

    Java源码:钉钉扫码登录示例源码2018127 在这个项目中,我们关注的是如何使用Java实现钉钉应用的扫码登录功能。钉钉是一款由阿里巴巴集团开发的企业级通讯与协作平台,它为企业提供了丰富的API接口,包括用户登录、...

    nodejs调用建行互联网银企被扫支付接口加密及验签Demo+java封装jar包

    该java源代码将建行互联网银企被扫支付接口java版加密及验签Demo 封装成jar包,方便nodejs调用。 1.将建行Java版加密Demo打包成jar包:CCBParam.jar。并将jar包放到服务器的相应文件夹下。 2.根据订单号、金额、付款...

    java生成二维码需要的包

    在Java编程环境中,生成二维码是一项常见的任务,尤其在移动应用、数据交换和信息展示等领域。为了实现这个功能,开发者通常需要引入特定的库或包。根据提供的标题和描述,我们聚焦于以下几个关键包: 1. **zxing-...

    java读取接码枪数据后台自动获取usb设备数据

    在Java编程环境中,读取接码枪(扫码枪)数据是一项常见的需求,特别是在物流、仓储、零售等场景中。本文将详细讲解如何实现这个功能,以及如何自动化地从USB设备获取数据并将其存储到数据库或文件中。我们将涵盖...

    扫码登录代码框架——java

    以下是对这个Java扫码登录代码框架的详细说明。 1. **二维码生成与解析** - **生成二维码**:Java中可以使用`Zxing`库(ZXing是“Zebra Crossing”的缩写,意为斑马线)来生成二维码。通过传入特定的数据(如登录...

    java实现微信扫码支付

    Java实现微信扫码支付涉及到微信支付API的调用和Java编程技术。微信扫码支付是一种便捷的移动支付方式,用户只需扫描商家提供的二维码即可完成支付。在Java中实现这一功能,主要涉及以下几个关键知识点: 1. **微信...

    java 微信扫码支付

    Java微信扫码支付是一种基于微信支付平台的支付方式,它允许用户通过扫描商家提供的二维码或一维码进行快捷的在线支付。在Java开发中,实现微信扫码支付涉及一系列的技术环节,包括微信支付API的调用、订单创建、...

    微信红包 JAVA

    Java中的`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util.concurrent`包下的并发工具类,都可以用来处理并发问题,保证数据的一致性和安全性。 4. **异常处理**:在处理红包分配时可能会遇到...

    java支付宝扫码

    Java支付宝扫码支付是一种常见的在线支付方式,主要用于移动设备上的交易。在Java开发环境中,我们可以利用支付宝提供的SDK(Software Development Kit)来实现扫码支付的功能。这个SDK包含了一系列的接口和类库,...

    一款Java餐饮点餐系统完整源码+说明(适用于多门店)(包含用户端、连锁餐饮和扫码点餐等核心功能).zip

    一款Java餐饮点餐系统源码+项目说明(适用于多门店)(包含用户端、商家端、配送端以及总管理后台,美食下单、外卖配送、连锁餐饮和扫码点餐等核心功能,同时提供积分商城、会员中心和邀请好友注册返现等增值服务)....

    扫号器java代码

    总之,这个Java扫号器是一个涉及文件操作、网络通信、并发处理、错误处理和性能优化等多个Java编程核心知识点的项目。通过研究和理解这个项目,开发者可以提升自己的Java技术能力,并了解到如何在实际场景中应用这些...

    基于Java的扫一扫点餐系统设计源码

    本项目是基于Java的扫一扫点餐系统设计源码,包含258个文件,其中主要包含200个java源代码文件,10个html页面文件等。系统采用了Java、HTML、JavaScript和CSS技术,实现了一套用户餐厅点餐的系统。用户可以通过扫码...

    扫码下载app代码说明(java,web)

    这里的"扫码下载app代码说明(java,web)"指的是使用Java和Web技术实现这一功能的代码实践。下面我们将深入探讨这个话题。 首先,我们需要了解扫码下载的基本流程: 1. **生成二维码**:服务器端根据Android和iOS...

Global site tag (gtag.js) - Google Analytics