我该如何访问类路径中jar包内的所有package-info类?我想要访问这些类中使用的包级别注解。
我想执行以下步骤:
- 找到所有的package-info.java类
- 获取它们的包
- 获取注解@PackageOwner
我该如何访问类路径中jar包内的所有package-info类?我想要访问这些类中使用的包级别注解。
我想执行以下步骤:
有一个更简单的解决方案,不涉及外部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());
}
}
}
Guava 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;
https://github.com/ronmamo/reflections
Reflections 的典型用法如下:Reflections reflections = new Reflections("my.project");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
Package
,而且无法直接引用现有类来获取Package
,那么可以使用以下方法加载package-info类并检索注释:Package pkg = Class.forName(packageName + ".package-info").getPackage();
PackageOwner packageOwner = pkg.getAnnotation(PackageOwner.class);
getPackage
,您也可以从package-info
Class
对象中获取注释,这就是Package#getAnnotation
在内部执行的操作。 - Clashsoft