2013-08-05 51 views
0

我試圖得到classOf[the-abstract-class-Option],但我總是得到classOf[the-Option-*object*]。我怎樣才能得到抽象類而不是?我如何獲得Scala的選項類,所以我可以將它傳遞給getDeclaredMethod()

Option.getClassclassOf[Option[_]]給我class scala.Option$

編輯:我不需要問這個;突然,classOf[Option[_]]工作正常,很奇怪。 /編輯

背景:

我試圖經由反射調用接受一個Option[String]參數的方法。
它的簽名看起來像這樣:...(..., anySectionId: Option[String], ...)...
在我可以調用該方法之前,我通過getDeclaredMethod查找它。但要做到這一點,我需要一個參數類型列表,我將通過調用_.getClass來構建參數類型,我將對該方法給出每個參數。但對於選項實例,_.getClass返回classOf[None]classOf[Some],這會使getDeclaredMethod失敗,因爲(?)簽名基於Option not Some/None。

下面的代碼:

val clazz: Class[_] = Play.current.classloader.loadClass(className) 

val paramTypes = arguments.map(_ match { 
    case None => Option.getClass // gives me the object, not the abstract class 
    case _: Some[_] => classOf[Option[_]] // this also gives me the object :-(
    case x => x.getClass // results in None or Some for Option instances 
}) 

val m: jl.reflect.Method = clazz.getDeclaredMethod("apply", paramTypes: _*) 

和上面的最後一行未能與任何Option參數(否則一切工作正常)的方法。

+0

我討厭當這種情況發生。 –

回答

1

最好的辦法是使用Scala的反射。

下一個最好的辦法是不要讓工作爲自己的努力相匹配參數類型

使用getClass失敗的子類型:

scala> class Foo 
defined class Foo 

scala> class Bar extends Foo 
defined class Bar 

scala> class Baz { def baz(f: Foo) = 1 } 
defined class Baz 

scala> val b = new Baz 
b: Baz = [email protected] 

scala> val p = new Bar 
p: Bar = [email protected] 

scala> classOf[Baz].getDeclaredMethod("baz", p.getClass) 
java.lang.NoSuchMethodException: Baz.baz(Bar) 

它更容易只是以匹配名稱:

scala> classOf[Baz].getMethods.find(_.getName == "baz") map (_.invoke(b,p)) getOrElse -1 
res5: Any = 1 

或params用於在窮人的重載決議編號過濾器,那麼也許在具有一致類型的所有ARGS過濾。

爲意外獲得對象的符號,其實是:

scala> classOf[Option$] 
res8: Class[Option$] = class scala.Option$ 
+0

謝謝!這很簡單。現在我的代碼如下所示:'viewClass.getMethods.find(_。getName ==「apply」)getOrDie「DwE74hG0X3」'。 – KajMagnus

1

答案:classOf[Option[_]]

奇怪!突然classOf[Option[_]]工程。我確信在我提交問題之前我測試了一次或兩次:-(也許在我重新編譯之前IDE沒有時間保存文件,奇怪。

我不知道我是否應該刪除該問題。或者,也許我應該離開它是,萬一classOf[Option[_]]不是有目共睹的。

相關問題