我使用谷歌反思和第三方图书馆的自定义类加载器。
扫描课程的工作方式如下:
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尝试使用默认的静态和上下文两个类加载器来扫描所有URL。
Reflection.scan()
更新:我找到了答案Can you find all classes in a package using reflection?,说“如果有类生成或远程交付,您将无法发现这些类。”但是,没有证据。 可以请任何人提供更多详细信息并确认吗?
答案 0 :(得分:1)
在运行时动态实例化类不更改JVM正在使用的类路径。发生的事情是某些ClassLoader类从某处获取字节码;并使其成为可用的#34;给你。但这决不会改变&#34;搜索顺序&#34;用于加载类(这基本上就是类路径的内容:它只告诉JVM在何处以及以何种顺序查找要加载的类)。
含义:任何&#34; loading&#34;一个类导致类java.lang.Class的某个对象。
如果要查询任何已加载类的结构;你&#34;只是&#34;需要获取相应的Class对象。类提供了getAnnotation()
之类的方法。它还提供了检索表示特定类的方法和字段的其他对象的方法;并且可以用类似的方式查询这些对象的注释。
更新,关于问题中的更新:有些情况下您无法访问类所在的文件系统。当你知道他们的名字时,你可以加载课程,但你无法查看&#34;地点&#34;这些课程住在哪里。这基本上打破了你按预期使用反射的能力。
没有必要&#34;证明&#34;这只是Java允许您在知道名称时加载类的结果,但是&#34;隐藏&#34;确切的内容&#34;其中&#34;这些课程来自。