package com.bda.icetea; import com.google.common.collect.Lists; import javax.persistence.Table; import java.io.File; import java.net.URL; 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<String> 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<String> 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<String> 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<String> classPaths = Lists.newArrayList(); ClassLoader classLoader = IceTeaClassUtil.class.getClassLoader(); //这里是具体扫描的包名 getClasses("com.bda", classPaths, classLoader); doSomething(classPaths, classLoader); } }
1.java使用类加载器获取注解的值
最新推荐文章于 2023-02-27 15:54:55 发布