gpt4 book ai didi

java - 如何扫描在运行时作为字节码加载的 java 类的特定注释?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:27 24 4
gpt4 key购买 nike

  1. 如果一个 java 类在运行时作为字节码加载(例如通过 ASM 库或其他机制),它是否位于 java 的类路径中?我没看到。
  2. 如果它不在 java 类路径中,如何扫描以这种方式加载的类的所有注释?

我使用谷歌反射和第 3 方库的自定义类加载器。

扫描类的工作方式如下:

            Reflections reflections = new Reflections(ClasspathHelper.forPackage("com.mypackage",
MyCustomClassLoader),
new SubTypesScanner(), new TypeAnnotationsScanner());
Set<Class<?>> myClasses = reflections.getTypesAnnotatedWith(MyAnnotation.class);

MyAnnotation - 标记为@Retention(RetentionPolicy.RUNTIME)。以上(在类中)由 JVM 在运行时动态加载。

可以看出,在幕后,Reflections 尝试使用 2 个默认静态和上下文类加载器扫描所有 URL。

反射.scan()

更新:我找到了答案Can you find all classes in a package using reflection?说“如果有远程生成或交付的类,您将无法发现这些类。”但是,没有证据。能否请任何人提供更多详细信息并确认?

最佳答案

在运行时动态实例化类不会更改您的 JVM 使用的类路径。发生的事情是某些 ClassLoader 类从某处获取字节码;并使其对您“可用”。但这绝不会改变加载类的“搜索顺序”(这基本上就是类路径的意义所在:它只告诉 JVM 在何处以及以何种顺序查找要加载的类)。

含义:类的任何“加载”都会导致类 java.lang.Class 的某个对象。

如果要查询任何加载类的结构;您“只”需要获取相应的 Class 对象。类提供了类似getAnnotation() 的方法。它还提供方法来检索表示特定类的方法和字段的其他对象;并且可以通过类似的方式查询这些对象的注释。

更新,关于问题中的更新:有些情况下您无法访问类所在的文件系统。当您知道类名时,您可以加载类,但您无法查看这些类所在的“位置”。这基本上会破坏您按预期使用反射的能力。

没有必要“证明”这一点,这仅仅是因为 Java 允许您在知道名称时加载类,但“隐藏”这些类来自“何处”的确切内容.

关于java - 如何扫描在运行时作为字节码加载的 java 类的特定注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29599072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com