开发者社区> 问答> 正文

Java语言编写的用于Avro工具的Scala类加载器运行方法

我在确定加载“ Avro Tools”类及其run方法的方法时遇到了一些困难。问题出在Java和Scala接口与类加载方法之间。由于avro在Spark应用程序的其他位置使用了不同版本来加载数据文件,因此我需要能够将此特定方法视为对另一版本avro-tools的孤立调用。

以下是我的代码: package samples

import java.io.{ByteArrayOutputStream, InputStream} import org.junit.runner.RunWith import org.specs2.mutable._ import org.specs2.runner._

import scala.collection.JavaConverters._

@RunWith(classOf[JUnitRunner]) class MySpecTest extends Specification { "Class Loader" should { "load an implement a class" in {

  var classLoader = new java.net.URLClassLoader(
    Array(new java.io.File("./avro-tools-1.9.1.jar").toURI.toURL),
    this.getClass.getClassLoader)

  var clazzDFRT = classLoader.loadClass("org.apache.avro.tool.DataFileRepairTool")

  val objDFRT = clazzDFRT.getConstructor().newInstance()
  val toolCmdArgsAsJava = List("-o", "all", "questionable.avro", "fixed.avro").asJava
  val stdin : InputStream = null
  val out: ByteArrayOutputStream = new ByteArrayOutputStream
  val err = System.err
  val toolClassArgsAsJava = List(stdin, out,err, toolCmdArgsAsJava).asJava

  //  parameterTypes: Class[_] *
  //  public int run( InputStream stdin, PrintStream out, PrintStream err, List<String> args)
  val method = clazzDFRT.getMethod("run",  Class[_] : _*)

  method.invoke(objDFRT.asInstanceOf[Object], toolClassArgsAsJava)

  // sidebar: is this the end result for the Unit test - want out str with summary
  out.toString("UTF-8").contains("File Summary")
}

} } 我在getMethod部分似乎有一些问题,但也许整个解决方案都有些不足-我需要能够调用该方法以及进行加载,实例化或...

如何解决此问题以运行整个代码段(并修复损坏的avro)?

展开
收起
被纵养的懒猫 2019-09-30 14:57:13 501 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载