如何从jar访问package-info.java运行时中的包级别注释?

Par*_*hit 4 java annotations

如何在类路径中访问jar中的所有package-info类?我想访问这些类中使用的包级别注释.

我想做以下步骤: -

  1. 找到所有的package-info.java类
  2. 得到他们的包裹
  3. 获取注释@PackageOwner

小智 6

有一个更简单的解决方案,不涉及外部API.您可以从位于要为其注释的包中的类获取Package对象.然后通过调用包上的方法getAnnotations()来获取这些注释:

import java.lang.annotation.Annotation;

public class PackageAnnotationsTest {

    public static void main(String[] args) {
        Package myPackage = AClassInMyPackage.class.getPackage();
        Annotation[] myPackageAnnotations = myPackage.getAnnotations();
        System.out.println("Available annotations for package : " + myPackage.getName());
        for(Annotation a : myPackageAnnotations) {
            System.out.println("\t * " + a.annotationType());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢这个帮助我解决这个问题的链接.我第一次看到这个帖子和Parikshit的答案,但我不想使用外部api.


Par*_*hit 5

番石榴14+来救援:)

以下代码有效

public class OwnerFinder {
    public static void main(String[] args) {
        try {
            ClassPath classPath = ClassPath.from(OwnerFinder.class.getClassLoader());
            classPath.getTopLevelClassesRecursive("com.somepackage")
                    .stream()
                    .filter(c -> c.getSimpleName().equals("package-info"))
                    .map(c -> c.load().getPackage().getAnnotation(PackageOwner.class))
                    .forEach(a -> System.out.println(a.owner()));

        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是package-info.java的注释应用

@PackageOwner(owner = "shaikhm")
package com.somepackage;
Run Code Online (Sandbox Code Playgroud)