如何在类路径中访问jar中的所有package-info类?我想访问这些类中使用的包级别注释。
我想执行以下步骤: -
答案 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);
这消除了使用外部依赖项的需要,并且您不必知道目标包中的任何类。