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

如何从jar访问package-info.java运行时中的包级注释?,java,annotations,Java,Annotations,如何在类路径中访问jar中的所有包信息类?我想访问这些类中使用的包级注释 我想执行以下步骤:- 查找所有package-info.java类 拿到他们的包裹 获取@PackageOwner注释 也许你可以试试反射库 反射的典型用途是: Reflections reflections = new Reflections("my.project"); Set<Class<? extends SomeType>> subTypes = reflections.getSubT

如何在类路径中访问jar中的所有包信息类?我想访问这些类中使用的包级注释

我想执行以下步骤:-

  • 查找所有package-info.java类
  • 拿到他们的包裹
  • 获取@PackageOwner注释

  • 也许你可以试试反射

    反射的典型用途是:

    Reflections reflections = new Reflections("my.project");
    
    Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
    
    Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
    
    Reflections=newreflections(“my.project”);
    Set>annotated=reflections.getTypesAnnotatedWith(SomeAnnotation.class);
    
    番石榴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();
            }
        }
    }
    
    下面是package-info.java的注释应用程序

    @PackageOwner(owner = "shaikhm")
    package com.somepackage;
    

    有一个更简单的解决方案,不涉及外部api。 您可以从位于需要注释的包中的类获取包对象。 然后通过调用包上的方法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());
            }
        }
    }
    
    多亏了这一点,在这个问题上帮助了我。
    我首先阅读了此线程和Parikshit的答案,但我不想使用外部api。

    如果需要动态加载
    包,并且不能直接引用现有类来获取
    包,则可以使用以下方法加载包信息类并检索注释:

    Package pkg = Class.forName(packageName + ".package-info").getPackage();
    PackageOwner packageOwner = pkg.getAnnotation(PackageOwner.class);
    

    这消除了使用外部依赖项的需要,并且您不必知道目标包中的任何类。

    javadoc包可能会有所帮助。我意识到查找包信息类是行不通的。我不能使用reflections.getsubsubscriptsof(package info.class)。它给出了一个编译错误。可能是因为包信息没有任何类结构。希望有一个api来访问带注释的包。我尝试了Package.getPackages(),但它只返回加载类的包。我的问题是,基本包中有许多“Package info”类。另外,我不能使用“package info.class.getPackage()”,因为编译器抛出了一个错误。我真的不明白。每个包只能有一个package-info.java文件。访问这个文件中的注释的方法是调用包的一个真实类,而不是包“类”(这不是一个真正的类)本身。我只能有一个包-info.java用于该包。但我可以在“com.mercedes.car.engine”中有一个单独的软件包。我也不知道包中存在什么类。因此不存在AClassInMyPackage.class.getPackage()的问题;我假设您的问题是在从package-info.class文件检索信息的过程中,而不是在查找所有包并读取其关联注释的过程中。附录:注释本身必须使用@Retention(RetentionPolicy.RUNTIME)进行注释需要注意的是,您不必使用
    getPackage
    ,还可以从
    package info
    Class
    对象中获取注释,这是
    package\getAnnotation
    在内部所做的。