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

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

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());
                }
            }
        }

    }
}
时间: 2024-11-06 13:34:32

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

Linux中对目录和文件管理所使用的命令(理论部分,无图慎入!)

本次我和小伙伴们分享的是Linux系统中目录和文件管理所使用的的命令,接下来我会从以下几点和大家进行详细解析 Linux目录结构 查看及检索文件 备份及恢复文档(压缩包格式) VI文本编辑器 (一).Linux目录结构 1.树形目录结构2.根目录:? 所有分区.目录.文件等的位置起点? 整个树形目录结构中,使用独立的一个"/"表示3.常见的子目录:? /root(系统管理员的宿主目录)? /bin(所有用户可执行的命令) ? /boot(系统内核,启动文件) ? /dev(设备文件)?

用svn下载github中指定目录的文件

1.先用命令看看github的分支 svn ls https://github.com/BlueRiverInteractive/robovm-ios-bindings 输出: branches/ trunk/ 或者使用UI操作,浏览目录(一般在库下面都有两个目录:branches,trunk) 打开trunk目录下面就可以看到这个库下面的目录和文件了 然后: svn ls https://github.com/BlueRiverInteractive/robovm-ios-bindings/t

spring boot mybatis没有扫描jar中的Mapper接口

只需要在spring boot启动类上加上注解,并指定jar包中接口文件包路径即可 如下: @ComponentScan(basePackages = "com.xx") @MapperScan(basePackages = "com.xx.**.dao") @SpringBootApplication @EnableCaching @EnableDiscoveryClient public class EnterApplication { public stati

Linux基本命令详解《二》(Linux中对目录和文件管理所使用的命令)

Linux基本命令详解<二>内容概述:Linux目录结构查看及检索文件备份及恢复文档vi文本编辑器一,Linux目录结构:树形目录结构(自顶而下)常见的子目录及作用:a./root:系统管理员root的宿主目录b./home:普通用户的宿主目录c./boot:系统内核/启动文件d./dev:设备文件e./etc:配置文件f./bin:所有用户可执行的命令g./sbin:管理员可执行的管理命令h./usr:应用程序i./var:日志文件(俗称可变长文件目录)j./proc :硬件配置信息k. /

linux中的目录和文件的统计

ls 目录 | wc -l find  ./   -type   d   |   wc   -l      //查找目录个数 find   ./   -type   f   |   wc   -l     //查找文件个数

总结加密、机密jar中的class

1.加密和解密部署到jboss中间件中的的单个class文件,原理:使用“java源程序加密解决方案(基于Classloader解密) (2014-07-13 11:31)”blog即可实现: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; //加密class文件 pub

Eclipse导出Jar包 和 MANIFEST.MF文件

Eclipse 导出Jar包,在工程中File-Export-JAR file-Next...-Finish,注意选择自己的程序Main Class,其中Jar包中的MANIFEST.MF文件包含了jar的主程序入口和依赖jar的存放位置等信息. Java -jar  Test.jar 导出Jar包后,如有外部包依赖,还要修改Jar包中的 MANIFEST.MF 文件 Manifest-Version: 1.0 Main-Class: modification.AppFrame Class-Pa

[Python] 目录和文件操作

在Linux系统下用Python写脚本,肯定不能避免各种与目录和文件夹有关的操作.为了以后方便查阅,简单地针对Python中与目录和文件夹有关的操作进行汇总. 需要实现导入的模块为: import os 1. 得到当前工作目录,即当前Python脚本工作的目录路径: path=os.getcwd() 在这里引用一个比较好的例子,来源于:牛皮糖的旅程 我们将abc.py放入A文件夹.并且希望不管将A文件夹放在硬盘的哪个位置,都可以在A文件夹内生成一个新文件夹.且文件夹的名字根据时间自动生成. im

目录和文件举例

PHP如何操作目录与文件? 一.文件目录操作 文件目录是指存储在磁盘中的文件的索引,也可以将其视为一个文件夹,在这个文件夹中可以存放其他文件或文件夹.最顶层的目录是磁盘的根目录,用"/"或"\\"表示."/"表示当前工作目录,"../"表示Apache的文件根目录.文件夹前不指定位置,则默认在当前工作目录中查找. 1.创建和删除目录 使用mkdir()函数可以根据提供的目录名或目录的全路径,创建新的目录,成功则返回TRUE,否