Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有可能;“探索”;在运行时通过反射在其他对象中定义哪些对象?_Java_Reflection_Scala_Object_Classloader - Fatal编程技术网

Java 有没有可能;“探索”;在运行时通过反射在其他对象中定义哪些对象?

Java 有没有可能;“探索”;在运行时通过反射在其他对象中定义哪些对象?,java,reflection,scala,object,classloader,Java,Reflection,Scala,Object,Classloader,考虑以下代码: object A { object AA extends A object AB extends A object AC extends A }; class A 如何在运行时“查看”对象A中定义的对象? 我认为在对象a中使用一些简单的反射代码的方法就足够了,但编译器似乎在编译时将对象层次结构展平,并创建了以下类文件: A.class——A类 A$class–A$class的伴生对象 A$AA$.class–AA对象 A$AB$.class–AB对象 A$AC$.

考虑以下代码:

object A {
  object AA extends A
  object AB extends A
  object AC extends A
}; class A
如何在运行时“查看”对象
A
中定义的对象? 我认为在
对象a
中使用一些简单的反射代码的方法就足够了,但编译器似乎在编译时将对象层次结构展平,并创建了以下类文件:

  • A.class
    ——A类
  • A$class
    –A$class的伴生对象
  • A$AA$.class
    –AA对象
  • A$AB$.class
    –AB对象
  • A$AC$.class
    –AC对象
编译后,伴随对象
A
中没有关于
AA
AB
AC
的符号,这将具有我的
magicMethod


似乎
ClassLoader
类有一些与我计划执行的操作相关的方法,但似乎都期望类的确切字符串名称。有没有一种方法可以让类加载器在该类的路径中找到以调用该方法的类(
a$
)开头的所有类文件?

根本的问题是JVM没有内部类的概念。它们是在Java1.1中添加的,但是JVM规范在1.0和invokedynamic的引入(说真的!)之间保持完全不变

作为一种技巧,您可以随时解析类名并在
$

更新

为了做到这一点,很遗憾,您必须扫描类路径

ApacheCommonsDiscovery是该技术的一个更为知名的应用程序:(这是一个可以让您的生活更轻松的东西)


Spring也使用相同的方法。

代码
this.getClass.getDeclaredClasses
应返回请求的信息。

但在对各种工具进行了一点试验后,它怀疑这里有些东西工作不正常

我在Scala中尝试了各种各样的方法,将类放在类中,而不是对象和Java源代码中,从行为上看,它应该会清晰地返回预期的结果,但目前没有

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


请参阅。

如何找到类名以便解析它们?遗憾的是,您必须扫描类路径。现在似乎很流行。如果是这样的话,一个链接或一个典型方法的例子可以大大提高你的答案!尽管VM不知道内部类,但反射应该可以工作,并且在Java代码中确实可以按预期工作。这似乎是Scala编译器中的一个bug。您是否尝试过获取javap和scalap所专有的信息?也许能帮上点忙。是的。看起来和预期的一样。希望能解决这个问题。哎呀,你真的很清楚如何声明这些
MonthDate
对象。是:-)。基本上,我需要简洁的干代码,可以添加我自己的方法,用户可以实例化自己的实例,而不会与声明的实例类型不匹配,并且需要“自我意识”,以便对象知道它实际拥有多少对象(并且可以检索它们)。一切都没有发明特殊的语法或规则,比如注册实例。