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

Viewed 433

Imagine that we have a class:User.java below package: src/service/model

And we can get the package (src/service/model) annotations using User.class.getPackage().getAnnotaions();

Then How can we get the parent package (src/service) annotations.

I don't know how to get package annotations in a skip level.

1 Answers

You can get all packages in app and than filter required package to get 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]);

, but Package.getPackages() will only return the packages defined in the current class loader (any classes from root package (src/service) were loaded by current class loader).

java.lang.Package snippet:

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

/** @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);
}
Related