【问题标题】:How can we get parent package annotations?Anyone offer an example?我们如何获得父包注释?有人提供示例吗?
【发布时间】:2020-08-30 17:37:30
【问题描述】:

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

我们可以得到 package (src/service/model) annotations 使用User.class.getPackage().getAnnotaions();

那我们怎样才能得到父包 (src/service)注解

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

【问题讨论】:

    标签: java reflection annotations package


    【解决方案1】:

    您可以在应用程序中获取所有包,然后过滤所需的包以获取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() 只会返回在current class loader 中定义的包(来自根包(src/service)的任何类都由current class loader 加载)。

    java.lang.Packagesn-p:

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

    【讨论】:

    • $xslt Optional<Annotation[]> obj1 = Arrays.stream(Package.getPackages()) .filter(pack -> pack.getName().equals("com.goods.center.backend.controller")) .findFirst() .map(Package::getAnnotations); Optional<Annotation[]> obj2 = Arrays.stream(Package.getPackages()) .filter(pack -> pack.getName().equals("com.goods.center.backend.controller.merchant")) .findFirst() .map(Package::getAnnotations); 遇到另一个问题。 obj1 为空。obj2 不为空。为什么obj1是空的?
    • java.lang.Package.getPackages() 方法获取调用者的 ClassLoader 实例当前已知的所有包。这些包对应于通过该 ClassLoader 实例加载或按名称可访问的类。如果调用者的ClassLoader实例是bootstrap ClassLoader实例,在某些实现中可能用null表示,则只会返回bootstrap ClassLoader实例加载的类对应的包。
    • 调用者是这个答案中的代码。所以它肯定不是由引导加载程序加载的。但是为什么要使用这个流来搜索所有的包呢?为什么不直接使用Annotation[] annotations = Package.getPackage(parentPackName).getAnnotations();
    • @Deprecated(since="9") public static Package getPackage​(String name): docs.oracle.com/javase/9/docs/api/java/lang/…
    • @kozmo@Holger 感谢您的指示。最后一个:如果“com.service”下没有类,尽管“com.service.model”下有很多类,API Package.getPackage(“com.service”)会返回null。我不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多