代码之家  ›  专栏  ›  技术社区  ›  soc Bhuwan Tripathi

是否可以在运行时通过反射“探索”其他对象中定义的对象?

  •  2
  • soc Bhuwan Tripathi  · 技术社区  · 15 年前

    请考虑以下代码:

    object A {
      object AA extends A
      object AB extends A
      object AC extends A
    }; class A
    

    如何“看到”对象中定义的对象 A 在运行时? 我在想一个方法 object A 使用一些简单的反射代码就足够了,但是编译器似乎在编译时将对象层次结构展平,并创建了以下类文件:

    • A.class “A级”
    • A$class 伴生物体
    • A$AA$.class AA对象
    • A$AB$.class AB对象
    • A$AC$.class –AC对象

    编译后没有任何迹象表明 AA , AB AC 在伴生物体中 一个 ,这会让我 magicMethod .

    看起来 ClassLoader 类有一些与我计划执行的操作相关的方法,但所有这些方法似乎都需要类的确切字符串名称。是否有方法要求类加载器查找以调用此方法的类开头的所有类文件( A$ )在那个班的路上?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Kevin Wright    15 年前

    根本的问题是JVM没有内部类的概念。它们是在Java 1.1中添加的,但是JVM规范在1.0和invokedynamic的引入(真的!).

    作为一个小技巧,您总是可以解析类名并继续 $

    更新

    为了做到这一点,您将不得不扫描类路径。

    这项技术的一个较著名的应用是Apache Commons Discovery: http://commons.apache.org/discovery/ (你可以用它来让你的生活更轻松)

    Spring也使用同样的方法。

        2
  •  1
  •   soc Bhuwan Tripathi    15 年前

    守则 this.getClass.getDeclaredClasses 应返回请求的信息。

    但在尝试了一些不同的工具之后,它怀疑这里有些东西不能正常工作。

    我在Scala中用类代替对象和Java源代码,尝试了各种各样的方法,从行为上判断,它显然应该返回预期的结果,但目前没有。

    要么我根本错了要么 scalac 可能忘记将一些元数据放入它生成的类文件中,从而导致不正确的反射信息。

    this bug report .