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

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

扫描类的工作原理如下:

            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()

更新:我找到了答案你能找到使用反射的包中的所有类吗?说“如果有生成的类或远程交付的类,您将无法发现这些类。” 但是,没有证据。可以请任何人提供更多细节并确认吗?

4

1 回答 1

1

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

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

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

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

没有必要“证明”这一点,这只是Java允许您在知道名称时加载类的事实的结果,但“隐藏”了这些类来自“哪里”的确切内容。

于 2015-04-13T06:35:58.147 回答