2
我想解決一個Config
對象一個類型安全的配置對象,說config1
與其他說config2
。解決與其他
唯一的公共API,允許類的東西是config1.withFallback(config2).resolve()
。然而,這增加了從config2
到config1
的條目,這不是我們想要的。
在一些調查中,我們發現了一個名爲ResolveContext
所提供的方法應該是一個非公共類。所以我們正在利用反射。我們當前的代碼:
object ConfigImplicits {
implicit class RichConfig(val config: Config) extends AnyVal {
def resolveWith(source: Config): Config = {
val resolver = resolveContext.getDeclaredMethod(
"resolve",
abstractConfigValue,
abstractConfigObject,
configResolveOptions
)
resolver.setAccessible(true)
resolver.invoke(
null,
config.underlyingAbstractConfigObject,
source.underlyingAbstractConfigObject,
ConfigResolveOptions.defaults
).asInstanceOf[ConfigObject].toConfig
}
def underlyingAbstractConfigObject = {
val f = simpleConfig.getDeclaredField("object")
f.setAccessible(true)
f.get(config)
}
}
val resolveContext = Class forName "com.typesafe.config.impl.ResolveContext"
val abstractConfigValue = Class forName "com.typesafe.config.impl.AbstractConfigValue"
val abstractConfigObject = Class forName "com.typesafe.config.impl.AbstractConfigObject"
val configResolveOptions = classOf[ConfigResolveOptions]
val simpleConfig = Class forName "com.typesafe.config.impl.SimpleConfig"
}
我們認識到,依靠非公開內臟可能不是一個好主意。所以:
- 有沒有公開的方法,我們不知何故錯過了,它已經這樣做了?
- 如果不是,我們是否應該提出拉動要求?
看起來有些主持人濫用自己的權利,並刪除了我這裏發表最後一次評論。爲了正確地繼續溝通,我會重複我發佈的內容(根據我所記得的內容):「謝謝,我會分叉並嘗試添加方法,如果我成功了,請提出請求。」如承諾的那樣,我嘗試過,但層次結構似乎奇怪地糾纏在一起,我無法添加該方法。 [1/2] – missingfaktor
您提出的解決方法對我們來說不起作用,因爲原始配置已經有了這些密鑰。我們不希望它們被替換,這就是爲什麼而不是使用'withFallback'來編寫我們的'resolveWith'(它使用反射)。 – missingfaktor
對於未來的旁觀者,現在有一個resolveWith()API可用。 –