是否有任何可能的方法將類名/路徑作為String引數傳遞以在運行時在代碼中呼叫它?我正在使用一些遺留代碼,我無法在全球范圍內更改它。創建新的集成建議我創建類X的新副本,重命名它,并傳遞我手動創建的Y的新實體。我的想法告訴我將Y作為某種引數傳遞,并且永遠不要再復制X。
uj5u.com熱心網友回復:
我不太明白為什么你(認為)你需要做你想做的事情(為什么首先復制類而不是僅僅使用它?為什么傳遞類名而不是類本身?),但是,是的,您可以使用反射通過(完全限定的)名稱實體化類。
首先你得到類本身的句柄:
val clazz = Class.forName("foo.bar.X")
然后,如果建構式不需要任何引數,你可以這樣做
val instance = clazz.newInstance
如果您需要將引數傳遞給建構式,它會變得有點復雜。
val constructor = clazz.getConstructors().find { c =>
c.getParameters().map(_.getParameterizedType) == args.map(_.getClass)
}.getOrElse (throw new Exception("No suitable constructor found")
// or if you know for sure there will be only one constructor,
// could just do clazz.getConnstructors.headOption.getOrElse(...)
val instance = constructor.newInstance(args)
但是請注意,結果instance
是型別Object
( AnyRef
),因此如果不強制轉換為您的類已知實作的某些介面型別,您實際上無法使用它。
讓我再說一遍:這很可能不是實作您實際嘗試做的事情的最佳方式。如果您打開另一個問題并描述您的實際問題(而不是您嘗試實施的解決方案),您可能會得到更多有用的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467643.html
標籤:斯卡拉
上一篇:Spark-將嵌套列更新為字串