最近在做自己的springMVC的轮子,涉及指定包下类的加载,所以写了一下此工具类。
package com.jsalpha.utils.load;
import com.jsalpha.utils.common.DirectoryFileFilter;
import com.jsalpha.utils.common.SuffixFilenameFilter;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
/**
* @author dengjingsi
* 加载指定包下的类的工具类
*/
public class ClassOfPackageLoader {
/**
* 加载path目录下的packageName中所有类
* @param path package所在的地址
* @param packageName package的名字
* @throws ClassNotFoundException
*/
public void loadInnerClassOfpackage(String path,String packageName) throws ClassNotFoundException {
//存储扫描到的类名变量
LinkedList<String> classNames = new LinkedList<>();
//获取包下的所有的类名
collectClassOfPackageInner(path,packageName,classNames);
//加载所有扫描到的类
loadClass(classNames);
}
/**
* 根据提供的包名,以及包所在的地址,扫描并存储package下的所有类的类名
* @param path package的地址
* @param packageName 包名
* @param classes 供存储类名的变量
* @throws ClassNotFoundException
*/
public void collectClassOfPackageInner(String path,String packageName,LinkedList<String> classes){
String packagePath = packageName.replace(".",File.separator);
File f = new File(path+File.separator+packagePath);
String[] fileNames = null;
if(f.exists()){
//获取该路径下所有的.class类文件
fileNames = f.list(new SuffixFilenameFilter());
for(String classFileName : fileNames){
classFileName = classFileName.substring(0,classFileName.length()-6);
classes.add(packageName+"."+classFileName);
}
//获取该路径下的所有目录
File[] files = f.listFiles(new DirectoryFileFilter());
for(File file : files){
collectClassOfPackageInner(path,packageName+"."+file.getName(),classes);
}
}
}
/**
* 根据classNames中类名,加载所有类
* @param classNames 需要加载的类名集合
* @throws ClassNotFoundException
*/
public void loadClass(List<String> classNames) throws ClassNotFoundException {
for(String className : classNames){
loadClass(className);
}
}
/**
* 加载类名为className的类
* @param className 需要加载的类名
* @return
* @throws ClassNotFoundException
*/
public Class<?> loadClass(String className) throws ClassNotFoundException {
return this.getClass().getClassLoader().loadClass(className);
}
public static void main(String[] args) throws ClassNotFoundException{
/**
* 测试
* 注意:如果你的测试结果报ClassNotFoundException异常,请检查你的classPath参数对应的路径下有没有指定的包
*/
ClassOfPackageLoader myClassLoader = new ClassOfPackageLoader();
//下边是我测试的包所在绝对地址和包名
myClassLoader.loadInnerClassOfpackage("/Users/iyunxiao/IdeaProjects/utils/target/classes","com.jsalpha.utils");
}
}
package com.jsalpha.utils.common;
import java.io.File;
import java.io.FileFilter;
/**
* @author dengjingsi
* 目录文件过滤器,过滤指定路径下的目录
*/
public class DirectoryFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
return false;
}
}
package com.jsalpha.utils.common;
import java.io.File;
import java.io.FilenameFilter;
/**
* @author dengjingsi
* 实现过滤以某字符串结尾的过滤器,空构造器,默认实现过滤以.class结尾的文件
*/
public class SuffixFilenameFilter implements FilenameFilter {
private String endWith = ".class";
/**
* 构建默认扫描.class后缀的文件过滤器
*/
public SuffixFilenameFilter() {
}
/**
* 构建扫描endWith后缀的文件过滤器
* @param endWith
*/
public SuffixFilenameFilter(String endWith) {
this.endWith = endWith;
}
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(endWith)){
return true;
}
return false;
}
}
项目结构
提醒大家注意:类加载,只是把类的二级制文件加载到JVM而已,并没有初始化。