如何扫描运行时作为字节码加载的java类的特定注释? 如果java类在运行时作为字节码加载(例如通过ASM库或其他机制),它是否位于java的类路径上?我看不出来 如果不在java类路径上,如何扫描以这种方式加载的类的所有注释

如何扫描运行时作为字节码加载的java类的特定注释? 如果java类在运行时作为字节码加载(例如通过ASM库或其他机制),它是否位于java的类路径上?我看不出来 如果不在java类路径上,如何扫描以这种方式加载的类的所有注释,java,reflection,classloader,reflections,Java,Reflection,Classloader,Reflections,我使用google reflections和第三方库的自定义类加载器 扫描类的工作如下: Reflections reflections = new Reflections(ClasspathHelper.forPackage("com.mypackage", MyCustomClassLoader), new SubTypesScanner(), new TypeAnnotationsSca

我使用google reflections和第三方库的自定义类加载器

扫描类的工作如下:

            Reflections reflections = new Reflections(ClasspathHelper.forPackage("com.mypackage",
                    MyCustomClassLoader),
                    new SubTypesScanner(), new TypeAnnotationsScanner());
Set<Class<?>> myClasses = reflections.getTypesAnnotatedWith(MyAnnotation.class);
Reflections Reflections=new Reflections(ClasspathHelper.forPackage(“com.mypackage”),
MyCustomClassLoader),
新的子类扫描程序(),新的类型注释扫描程序();

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

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

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

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


无需“证明”,这仅仅是Java允许您在知道类的名称时加载类的结果,但“隐藏”了这些类的“来源”的确切内容。

有没有办法不使用其引用获取此类类的类加载器,即:SomeClass.class.getClassLoader()。我需要扫描java包下的注释,但我不想尝试所有的类加载器,这取决于您使用的库。正常情况下,动态加载过程的结果。。。实际上是类的对象。因此,您可能需要研究正在使用的库的文档。此外:如果您已经可以键入“SomeClass.class”-那么您就不需要类加载器,因为SomeClass.class会返回您要查找的类对象。但当然,这只适用于编译时已知的类。我得出结论,类加载器只能扫描其类路径下的项。运行时加载的注释不在类路径中。因此,问题仍然悬而未决。您没有得到答案:您不需要类加载器。您必须了解库如何加载类。正如我告诉过你的:类对象包含所有结构信息。注释,就像Java类中的其他内容一样;因此,您可以通过这种方式获得所有必需的信息。您能解释一下为什么我需要知道如何加载带注释的类吗。是的,它是以某种方式加载的-这就足够了。但是通过google reflections进行扫描是行不通的。这个库引用类加载器来获取所有URL的集合。