可用于springboot的jar的扫描特定包的所有类的方法


之前有遇到过本地测试跑的通的代码,上到线上就失败的情况,当时是一个文件处理的操作。

后面才发现spring boot打的jar包,和直接本地用IDEA运行的代码多多少少还是有区别的,再一个就是windonws和linux系统,也多多少少有点不同。

这回写了扫描包代码,然后用jar测试了下,

下面是两个获取某个包下所有有特定注解类的代码,都是网上copy的

/**
* 不可用于jar
*/
public
List<Class<?>> a() { List<Class<?>> classList = new ArrayList<>(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(); try { Resource[] resources = resolver.getResources("classpath*:com/bzua/jingdata/service/**/*.class"); ClassLoader loader = ClassLoader.getSystemClassLoader(); for (Resource resource : resources) { MetadataReader reader = metaReader.getMetadataReader(resource); String className = reader.getClassMetadata().getClassName(); Class<?> clazz = loader.loadClass(className); if (clazz.isAnnotationPresent(Report.class)) { classList.add(clazz); } } } catch (ClassNotFoundException | IOException e) { log.error("错误信息: ", e); } return classList; }
  /**
  * 可用于jar
  */
public List<Class<?>> b() { List<Class<?>> classList = new ArrayList<>(); ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); final String BASE_PACKAGE = "com.bzua.jingdata.service"; final String RESOURCE_PATTERN = "/**/*.class"; try { String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN; Resource[] resources = resourcePatternResolver.getResources(pattern); //MetadataReader 的工厂类 MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver); for (Resource resource : resources) { //用于读取类信息 MetadataReader reader = readerfactory.getMetadataReader(resource); //扫描到的class String classname = reader.getClassMetadata().getClassName(); Class<?> clazz = Class.forName(classname); //判断是否有指定主解 if (clazz.isAnnotationPresent(Report.class)) { classList.add(clazz); } } } catch (IOException | ClassNotFoundException e) { } return classList; }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM