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

时间:2015-04-13 06:29:41

标签: java reflection classloader google-reflections

  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尝试使用默认的静态和上下文两个类加载器来扫描所有URL。

    Reflection.scan()

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

1 个答案:

答案 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;这些课程来自。