【Java】包扫描工具(含jar包)

 包扫描工具:

 

1.普通包扫描:

 

	// 需要包的路径和包名称
	private void packageScanner(String packagePath, String packageName) {
		// 通过包路径得到当前文件
		File currentFile = new File(packagePath);
		
		if(!currentFile.exists()) {
			return;
		}
		// 得到当前文件下的所有文件
		// 通过文件过滤器接口得到所有的目录类型的文件
		File[] listFile = currentFile.listFiles(new FileFilter() {
			
			// 若当前文件是目录则返回true,否则就是最终的class文件
			// java内部最终执行的是对源码预编译的字节码文件,是class文件
			@Override
			public boolean accept(File pathname) {
				if (currentFile.isDirectory()) {
					return true;
				}
				return pathname.getName().endsWith(".class");
			}
		});
		// 递归遍历,扫描所有的目录,并更新当前目录的路径
		for (File file : listFile) {
			if (file.isDirectory()) {
				packageScanner(file.getAbsolutePath(),
						packageName + "." + file.getName());
			} else {
				// 扫描到类时,去除后缀,得到该类全名
				String fileName = file.getName();
				int index = fileName.indexOf(".class");
				fileName = fileName.substring(0, index);
				String className = packageName + "." + fileName;
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
	}
	

2.jar包扫描: 

    // URL 是统一资源定位符。
	// 对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,
	//是互联网上标准资源的地址。
	//互联网上的每个文件都有一个唯一的URL,
	//它包含的信息指出文件的位置以及浏览器应该怎么处理它。
	private void packageScanner(URL url) {
		try {
			JarURLConnection jarURLConnection = 
					(JarURLConnection) url.openConnection();
			JarFile jarFile = jarURLConnection.getJarFile();
			Enumeration<JarEntry> jarEntries = jarFile.entries();
			while (jarEntries.hasMoreElements()) {
				JarEntry jarEntry = jarEntries.nextElement();
				if (jarEntry.isDirectory() || !jarEntry.getName().endsWith(".class")) {
					continue;
				}
				String className = jarEntry.getName();
				int index = className.indexOf(".class");
				className = className.substring(0, index).replace("/", ".");
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 3.对包的类型判断,该方法由外部调用(上述两个方法仅为当前方法使用)。

public void packageScan(String rootPackage) {
		// 类加载
		this.classLoder = Thread.currentThread().getContextClassLoader();
		Enumeration<URL> urls;
		try {
			urls = classLoder.getResources(rootPackage.replace(".", "/"));
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				// 获取协议名称
				String jarPortocol = url.getProtocol();
				// 根据URL判断其属性
				if (jarPortocol.equals("file")) {
					// 抽象出路径名
					try {
						File file = new File(url.toURI());
						packageScanner(file.getAbsolutePath(), rootPackage);
					} catch (URISyntaxException e) {
						e.printStackTrace();
					}
				} else if (jarPortocol.equals("jar")) {
					packageScanner(url);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 4.该工具类为抽象类,将得到的类交由用户处理。并且还需添加根据类来对该类所在包的扫描的方法。

	// 将扫描出来的类由用户处理
	public abstract void dealClass(Class<?> klass);

	// 通过类来扫描类所在的包
	public void packageScan(Class<?> klass) {
		packageScan(klass.getPackage().getName());
	}

完整代码: 

package com.chy.package_scan.core;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public abstract class PackageScan {
	private ClassLoader classLoder;
	
	public PackageScan() {
	}
	
	public abstract void dealClass(Class<?> klass);
	
	private void packageScan(String packagePath, String packageName) {
		File currentFile = new File(packagePath);
		
		if(!currentFile.exists()) {
			return;
		}

		File[] listFile = currentFile.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File pathname) {
				if (currentFile.isDirectory()) {
					return true;
				}
				return pathname.getName().endsWith(".class");
			}
		});

		for (File file : listFile) {
			if (file.isDirectory()) {
				packageScan(file.getAbsolutePath(),
						packageName + "." + file.getName());
			} else {
				String fileName = file.getName();
				int index = fileName.indexOf(".class");
				fileName = fileName.substring(0, index);
				String className = packageName + "." + fileName;
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	private void packageScan(URL url) {
		try {
			JarURLConnection jarURLConnection = 
					(JarURLConnection) url.openConnection();
			JarFile jarFile = jarURLConnection.getJarFile();
			Enumeration<JarEntry> jarEntries = jarFile.entries();
			while (jarEntries.hasMoreElements()) {
				JarEntry jarEntry = jarEntries.nextElement();
				if (jarEntry.isDirectory() || !jarEntry.getName().endsWith(".class")) {
					continue;
				}
				String className = jarEntry.getName();
				int index = className.indexOf(".class");
				className = className.substring(0, index).replace("/", ".");
				try {
					Class<?> klass = Class.forName(className);
					dealClass(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void packageScan(Class<?> klass) {
		packageScan(klass.getPackage().getName());
	}
	
	public void packageScan(String rootPackage) {
		this.classLoder = Thread.currentThread().getContextClassLoader();
		Enumeration<URL> urls;
		try {
			urls = classLoder.getResources(rootPackage.replace(".", "/"));
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				String jarPortocol = url.getProtocol();
				if (jarPortocol.equals("file")) {
					try {
						File file = new File(url.toURI());
						packageScan(file.getAbsolutePath(), rootPackage);
					} catch (URISyntaxException e) {
						e.printStackTrace();
					}
				} else if (jarPortocol.equals("jar")) {
					packageScan(url);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis-Plus是一个使用广泛的Java持久层框架,它基于MyBatis进行了功能增强和扩展。要下载MyBatis-Plus的jar包,可以按照以下步骤进行: 1. 打开MyBatis-Plus的官方网站(https://mybatis.plus/)。 2. 在网站的首页上,你可以看到一个标题为"下载方式"的选项卡,点击进入。 3. 在下载方式页面上,你可以看到MyBatis-Plus的最新版本和相关说明。 4. 根据你的项目需要,选择合适的版本进行下载。可以点击版本号后的下载按钮,或者点击左侧的"Mvn Repository"链接,进入Maven仓库页面进行下载。 5. 如果你选择通过"Mvn Repository"下载,进入仓库页面后,你可以找到MyBatis-Plus的jar包和对应的依赖信息。 6. 点击jar包后面的"jar"按钮,即可下载对应的jar包文件。 7. 下载完成后,将jar包添加到你的项目中,可以使用任何Java的构建工具(如Maven、Gradle)进行依赖管理。 总结:要下载MyBatis-Plus的jar包,可以通过官方网站或Maven仓库进行下载。根据你的项目需求,选择合适的版本进行下载,并将jar包添加到你的项目中即可。 ### 回答2: mybatis-plus是一个简化和增强了MyBatis框架的第三方库,它提供了很多便利的功能和工具,可以简化我们在进行数据库操作时的开发工作。下面是关于mybatis-plus的jar包下载的说明: 1. 打开mybatis-plus的官方网站(https://mp.baomidou.com/),找到"下载"或"下载地址"等类似的链接。 2. 点击下载链接,进入下载页面。通常会提供多个版本的jar包选项,括稳定版和最新版。 3. 根据自己的需求选择合适的版本,一般情况下建议下载最新的稳定版来获得更多的功能和修复的bug。 4. 点击选择的版本,进行jar包下载。可以直接点击下载链接,或者通过右键选择"另存为"来保存jar包到本地。 5. 下载完成后,将下载的jar包拷贝到你的项目中的lib文件夹或者lib目录下。 6. 在你的项目中配置和使用mybatis-plus。通常需要在项目的配置文件中添加相应的依赖配置,以及指定mybatis-plus的扫描路径等相关配置。 7. 重新编译和运行你的项目,确保mybatis-plus的jar包已经正确引入并可以正常使用。 总之,通过官方网站下载mybatis-plus的jar包,然后按照项目需求进行配置和使用即可。下载的jar包可以根据你的项目需要选择合适的版本。 ### 回答3: MyBatis-Plus是一个基于MyBatis的增强工具,它简化了MyBatis开发过程中的很多操作,提供了更加方便、高效的方式来操作数据库。对于使用MyBatis-Plus开发的项目,我们需要将相应的jar包下载并导入到项目中。 首先,在进行jar包下载之前,我们要确保已经有一个项目来使用MyBatis-Plus。可以在项目的相关配置文件中添加MyBatis-Plus的依赖项。 在Maven项目中,可以在项目的pom.xml文件中添加如下依赖项来引入MyBatis-Plus: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 接下来,我们需要下载对应的jar包文件。可以通过多种方式来获取jar包文件。 第一种方式是通过Maven中央仓库下载。在Maven项目中,Maven会自动从中央仓库下载所需的jar包文件。 第二种方式是通过MyBatis-Plus官方网站下载。可以在MyBatis-Plus官方网站的下载页面中找到对应的jar包下载链接。点击下载链接即可获取jar包文件。 下载完成后,我们需要将下载的jar包导入到项目中。可以将jar包手动复制到项目的lib目录下,也可以通过IDE的依赖项管理工具来导入jar包。 最后,在项目中导入jar包之后,我们就可以开始使用MyBatis-Plus来简化我们的数据库操作了。 总结起来,下载MyBatis-Plus的jar包可以通过 Maven 中央仓库下载,也可以通过 MyBatis-Plus 官方网站进行下载。将下载的 jar 导入到项目中后,我们就可以开始使用 MyBatis-Plus 进行数据库操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值