【问题标题】:Scala Object in JavaJava 中的 Scala 对象
【发布时间】:2017-06-26 11:52:18
【问题描述】:

我与 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 分区的数据)的相同类型。

【问题讨论】:

标签: java scala apache-kafka cross-language


【解决方案1】:

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

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

这里没有什么神奇的。

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

【讨论】:

  • 太棒了!谢谢!我现在得到了一些价值。
  • 这不是公共 API 的一部分。 Kafka 使用 JMX 作为公开指标的标准,而我们的环境阻止我们使用 JMX,因此我们只需要构建一个指标报告服务,该服务使用类似于 github.com/krux/kafka-metrics-reporter 的 kafka 指标报告器,根本没有文档
【解决方案2】:

你看到的只是输出默认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)
}

【讨论】:

  • 线程“reporterBG”中的异常 java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
  • 您使用的是哪个版本的 Scala?您可以尝试将deep.mkString 替换为deepMkString
  • 感谢@Randall 替换它甚至没有编译。 (值 deepMkString 不是 Array[String] 的成员)如何检查版本?我使用 scala 只是为了从 Kafka 向我抛出的这些度量对象中获取值。我正在使用 maven,这个 (pastebin.com/7CLDkhp4) 是我的 pom.xml 参考 docs.scala-lang.org/tutorials/scala-with-maven.html
猜你喜欢
  • 2019-06-11
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2019-01-02
相关资源
最近更新 更多