让我代码发言:)
class TagCalculation {
def test_string(arg1: String,arg2: String) = arg1 + " " + arg2
def test_int(arg1: Int,arg2: Int) = arg1 + arg2
def test_mix1(arg1:Int,arg2:String) = "test mix1"
def test_mix2(arg1:Int,arg2:String,arg3:List[Any]) = "test mix2"
}
val get_test = new TagCalculation
//test mix2
val test_mix2_para = Array(1, "aa",List(1,2))
val argtypes4 = test_mix2_para.map(_.getClass)
val method4 = get_test.getClass.getMethod("test_mix2", argtypes4: _*)
然后错误输出:
阶> val argtypes4 = test_mix2_para.map( .getClass)argtypes4: Array [Class []] = Array(类java.lang.Integer,类 java.lang.String,类scala.collection.immutable。$ colon $ colon)
阶> val method4 = get_test.getClass.getMethod(“test_mix2”, argtypes4:_ *)java.lang.NoSuchMethodException: $ IWC万国表$$ $ TagCalculation.test_mix2(java.lang.Integer中, java.lang.String,scala.collection.immutable。$ colon $ colon)at java.lang.Class.getMethod(Class.java:1678)at $ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC。(:26)at $ $$ IWC IWC $$ IWC $$ IWC $$ IWC $$ IWC $$ IWC。(31)
有人可以给我一些帮助吗?
答案 0 :(得分:1)
我遇到了同样的问题,发现它可以通过使用某些类型并告诉编译器你到底做了什么。在您的情况下,您可以使用java.lang.Integer
而不是常规Int
,另外还可以使用List类型。这个例子正在起作用:
class TagCalculation {
def test(arg1: java.lang.Integer, arg2: String, arg3: scala.collection.immutable.$colon$colon[Any]) = "test mix2"
}
val getTest = new TagCalculation
val arg1: java.lang.Integer = 10
val arg2: String = "foobar"
// Just making a List[Any]
val arg3: scala.collection.immutable.$colon$colon[Any] = scala.collection.immutable.$colon$colon.apply('z', List("foo", 10))
val method = getTest.getClass.getMethod("test", arg1.getClass, arg2.getClass, arg3.getClass)
method.invoke(getTest, arg1, arg2, arg3)
不幸的是我不知道为什么会这样。
答案 1 :(得分:1)
你需要使用声明方法的类来调用getMethod
,否则它不起作用:
get_test.getClass.getMethod("test_mix2", classOf[Int], classOf[String], classOf[List[Any]])
(List
的类型参数因类型擦除无关紧要)。如果您查看argtypes4
,则不会包含这些类:将1
放入Array
并将对象框放到java.lang.Integer
,然后List(1, 2)
返回::
(由$colon$colon
转换为:
,因为List
不是JVM标识符中的合法字符),它是In [8]: df
Out[8]:
A B C
0 2 a a
1 3 s 3
2 4 c !
3 1 f 1
的子类。