我在确定加载“ 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)?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。