package com.bda.icetea;
import com.google.common.collect.Lists;
import org.apache.commons.collections.ListUtils;
import javax.persistence.Table;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author zhenhai.wan
* @Date 2021/7/2
*/
public class IceTeaClassUtil {
/**
* 根据路径获取class对象
* @param path 路径
* @param classPaths 存放class路径的集合
* @param classLoader 类加载器
*/
public static void getClasses(String path, List classPaths, ClassLoader classLoader){
//扫描包路径
path = path.replace(".","/");
//获取根路径
URL resource = classLoader.getResource(path);
//获取所有的.class文件
getClassesByResource(resource.getFile(),classPaths);
}
/**
* 根据根路径扫描class加到class路径集合中
* @param resourceFile 根路径
* @param classPaths 存放class路径的集合
*/
private static void getClassesByResource(String resourceFile, List classPaths) {
File file =new File(resourceFile);
for (File f : file.listFiles()) {
String s = f.getAbsolutePath();
//判断是不是class对象
if(s.endsWith(".class")){
s = s.substring(s.indexOf("com"), s.indexOf(".class"));
s = s.replace("\\",".");
classPaths.add(s);
}else {
//todo 如果不是class对象我这里默认为目录,那么就直接递归了.可能实际上不是这样需要调试 getClassesByResource(s,classPaths);
}
}
}
public static void doSomething(List classPaths, ClassLoader classLoader){
//遍历所有的对象找出带有@Table注解的class对象
//对这些class对象做业务处理
for (String s : classPaths) {
try {
Class cls = classLoader.loadClass(s);
//获取类中的所有的方法
if(cls.isAnnotationPresent(Table.class)){
Table annotation = (Table) cls.getAnnotation(Table.class);
System.out.println(annotation.name().toUpperCase());
}
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
List classPaths = Lists.newArrayList();
ClassLoader classLoader = IceTeaClassUtil.class.getClassLoader();
//这里是具体扫描的包名
getClasses("com.bda", classPaths, classLoader);
doSomething(classPaths, classLoader);
}
}