扫描Jar中或目录下类文件的Annotation

简介:

直接上代码,代码依赖tomcat的tomcat-coyote.jar。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package  guojje.tools;
 
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FilenameFilter;
import  java.io.IOException;
import  java.io.InputStream;
import  java.util.Enumeration;
import  java.util.LinkedList;
import  java.util.List;
import  java.util.Queue;
import  java.util.jar.JarEntry;
import  java.util.jar.JarFile;
 
import  org.apache.tomcat.util.bcel.classfile.AnnotationEntry;
import  org.apache.tomcat.util.bcel.classfile.ClassFormatException;
import  org.apache.tomcat.util.bcel.classfile.ClassParser;
import  org.apache.tomcat.util.bcel.classfile.JavaClass;
 
public  class  ScanAnnotations {
     public  static  void  main(String[] args)  throws  ClassFormatException,
             IOException {
         File dir =  null ;
         if  (args.length >  0 ) {
             dir =  new  File(args[ 0 ]);
         else  {
             dir =  new  File( "." );
         }
 
         File[] jarFiles = dir.listFiles( new  FilenameFilter() {
             @Override
             public  boolean  accept(File dir, String name) {
                 return  name.endsWith( ".jar" );
             }
         });
         
         List<File> classFiles =   new  LinkedList<File>();
         Queue<File> fileQueue =  new  LinkedList<File>();    
         fileQueue.offer(dir);
         File curFile =  null ;
         
         while  ((curFile = fileQueue.poll()) !=  null ) {
             File[] subFiles = curFile.listFiles();
             for  (File sub : subFiles) {
                 if  (sub.isDirectory()) {
                     fileQueue.offer(sub);
                 else  if  (sub.getName().endsWith( ".class" )) {
                     classFiles.add(sub);
                 }
             }
         }
         for  (File jf : jarFiles) {
             System.out.println(jf.getName());
             JarFile jarFile =  new  JarFile(jf);
             scanJarAnnotaiton(jarFile);
         }
 
         for  (File cf : classFiles) {
             System.out.println( "==="  + cf.getAbsolutePath() +  "===================" );
             scanClassFileAnnotaiton(cf);
         }
     }
 
     public  static  void  scanJarAnnotaiton(JarFile jarFile)  throws  IOException {
         Enumeration<JarEntry> ej = jarFile.entries();
         while  (ej.hasMoreElements()) {
             JarEntry je = ej.nextElement();
             if  (!je.isDirectory() && je.getName().endsWith( ".class" )) {
                 InputStream classStream = jarFile.getInputStream(je);
                 ClassParser classParser =  new  ClassParser(classStream);
                 JavaClass jc = classParser.parse();
                 if  (jc.getAnnotationEntries() !=  null
                         && jc.getAnnotationEntries().length >  0 ) {
                     System.out.println( "==="  + jarFile.getName() +  "======="
                             + jc.getClassName() +  "=========================" );
 
                     for  (AnnotationEntry ae : jc.getAnnotationEntries()) {
                         System.out.println(ae.getAnnotationType());
                     }
                 }
             }
         }
     }
 
     public  static  void  scanClassFileAnnotaiton(File cf)  throws  IOException {
         if  (!cf.isDirectory() && cf.getName().endsWith( ".class" )) {
             InputStream classStream =  new  FileInputStream(cf);
             ClassParser classParser =  new  ClassParser(classStream);
             JavaClass jc = classParser.parse();
             if  (jc.getAnnotationEntries() !=  null
                     && jc.getAnnotationEntries().length >  0 ) {
                 System.out.println( "==="  + cf.getAbsolutePath() +  "=================" );
 
                 for  (AnnotationEntry ae : jc.getAnnotationEntries()) {
                     System.out.println(ae.getAnnotationType());
                 }
             }
         }
 
     }
}

本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/1826325

相关文章
|
4月前
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件
|
3月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
56 0
|
26天前
|
Java Windows
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
|
1月前
|
Java Docker 容器
pandora boot热点应用探索问题之使用目录形态压缩jar包的问题如何解决
pandora boot热点应用探索问题之使用目录形态压缩jar包的问题如何解决
|
3月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
40 1
|
3月前
|
消息中间件 资源调度 Java
实时计算 Flink版产品使用问题之拉取代码没有这个类,但是在下载的jar包中有这个类,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
IDE 数据可视化 Java
Java基础6-Java文件和Java包结构和常用的jar包(二)
Java基础6-Java文件和Java包结构和常用的jar包(二)
41 0
|
3月前
|
Java Unix 编译器
Java基础6-Java文件和Java包结构和常用的jar包(一)
Java基础6-Java文件和Java包结构和常用的jar包(一)
63 0
|
4月前
|
运维 Dubbo Java
Serverless 应用引擎产品使用之在 Serverless 应用引擎中,查看镜像文件中的 JAR 文件如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
172 2
|
4月前
|
Java
win10下修改jar中的文件
win10下修改jar中的文件
55 1
win10下修改jar中的文件

热门文章

最新文章