如何从jar访问package-info.java运行时中的包级注释?
如何在类路径中访问jar中的所有包信息类?我想访问这些类中使用的包级注释 我想执行以下步骤:-如何从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
也许你可以试试反射库 反射的典型用途是:
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
在内部所做的。