Java 中的 Scala 对象

Scala Object in Java

我对 Scala 零接触。 我通过以下类型的库(kafka)返回了一个 scala 对象:

kafka.coordinator.GroupMetadataManager$$anon@2b9ee60f

我试图将其传递给 Scala 以获取一些有意义的信息。即访问数据成员。

package metricsReporter;
import kafka.coordinator.GroupMetadataManager;
class processMetrics {
  def hello() { println("Hello (class)") } // [1]
  def printGM(gmObject: AnyRef ) {
       println(gmObject)
  }

}

我正在从 java 中调用上述函数,就像这样

new processMetrics().printGM(metric);

此函数也在输出相同的文本。我还得到了其他相同类型的对象,如 anon$2、anon$3(它们应该有关于不同 kafka 分区的数据)。

您看到的只是输出默认 toString 实现。

也许你可以使用反射来获取字段的值?

def printGM(gmObject: AnyRef ) {
    val result = gmObject.getClass().getDeclaredFields().map { field => 
      field.setAccessible(true)
      s"${field.getName()}:${field.get(gmObject).toString()}"
    }.deep.mkString("[", ", ", "]")

    println(result)
}

您不需要在 Scala 中执行此操作。您在问题中所写的内容相当于 System.out.prinln(metric)。其他答案建议您执行的操作类似于:

for (Field field: metric.getClass().getDeclaredFields()) {
   field.setAccessible(true);
   System.out.println(field.getName() + ": " + field.get(metric));
}

这里没有什么神奇的事情发生。

这是另一个问题,这两种方法似乎都没有任何意义。您不需要使用反射来访问 public API 返回给您的数据。似乎绝对应该有更好的方法来做你想在这里做的事情......如果我们知道后者到底是什么...... 编辑:语法