我们如何获得父包注释?有人提供示例吗?

How can we get parent package annotations?Anyone offer an example?

假设我们有一个 class:User.java 下面的包: src/service/model

并且我们可以获得 (src/service/model) 注释 使用 User.class.getPackage().getAnnotaions();

那我们如何获取父包 (src/service) annotations.

我不知道如何在跳过级别中获得包注释

您可以获取应用程序中的所有包,然后过滤所需的包以获取 Annotations:

String userPackName = User.class.getPackage().getName();      // src.service.model
int lastIndex = userPackName.lastIndexOf(".");
String parentPackName = userPackName.substring(0, lastIndex); // src.service
Annotation[] annotations = Arrays.stream(Package.getPackages())
                .filter(pack -> pack.getName().equals(parentPackName))
                .findFirst()
                .map(Package::getAnnotations)
                .orElseGet(() -> new Annotation[0]);

,但 Package.getPackages() 只会 return 在 current class loader 中定义的包(任何来自根包 (src/service) 的 类 由 current class loader).

java.lang.Package 片段:

@CallerSensitive
public static Package[] getPackages() {
    ClassLoader cl = ClassLoader.getClassLoader(Reflection.getCallerClass());
    return cl != null ? cl.getPackages() : (Package[])BootLoader.packages().toArray((x[=11=]) -> {
        return new Package[x[=11=]];
    });
}

/** @deprecated */
@CallerSensitive
@Deprecated(
    since = "9"
)
public static Package getPackage(String name) {
    ClassLoader l = ClassLoader.getClassLoader(Reflection.getCallerClass());
    return l != null ? l.getPackage(name) : BootLoader.getDefinedPackage(name);
}