1

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

kafka.coordinator.GroupMetadataManager$$anon$2@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 分区的数据)的相同类型。

4

2 回答 2

1

您看到的只是输出默认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)
}
于 2017-06-26T13:17:21.327 回答
1

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

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

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

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

于 2017-06-26T14:55:58.530 回答