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

时间:2015-11-18 12:54:42

标签: java annotations

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

我想执行以下步骤: -

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

4 个答案:

答案 0 :(得分: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());
        }
    }
}

感谢这个link帮我解决了这个问题。 我首先阅读了这个帖子和Parikshit的答案,但我不想使用外部api。

答案 1 :(得分: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();
        }
    }
}
下面是package-info.java

的注释应用
@PackageOwner(owner = "shaikhm")
package com.somepackage;

答案 2 :(得分:1)

也许您可以尝试反射库。

https://github.com/ronmamo/reflections

反思的典型用法是:

Reflections reflections = new Reflections("my.project");

Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

答案 3 :(得分:0)

如果您需要动态加载Package,并且无法直接引用现有类来获取Package,那么您可以使用以下命令加载package-info类并检索注释:

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

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