考虑这段代码:
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 的伴生对象
-
A$AA$.class
– AA 对象
-
A$AB$.class
– AB 对象
-
A$AC$.class
– AC 对象
编译后没有任何迹象AA
, AB
or AC
在伴生对象中A
,这将使我的magicMethod
.
看来ClassLoader
类有一些与我计划执行的相关的方法,但似乎都期望类的确切字符串名称。有没有办法让 ClassLoader 查找以调用此方法的类开头的所有类文件(A$
)在该类的路径中?
根本问题是 JVM 没有内部类的概念。它们是在 Java 1.1 中添加的,但 JVM 规范在 1.0 和 invokedynamic 的引入之间完全保持不变(说真的!)。
作为一个黑客,你总是可以解析类名并拆分$
UPDATE
不幸的是,为了做到这一点,您必须扫描类路径。
该技术最著名的应用之一是 Apache Commons Discovery:http://commons.apache.org/discovery/ http://commons.apache.org/discovery/(这是你可以用来让你的生活更轻松的东西)
Spring也使用同样的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)