【发布时间】:2013-06-20 22:42:53
【问题描述】:
我想解决一个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"
}
我们意识到,依赖非公开内部信息可能不是一个好主意。所以:
- 是否有一个我们以某种方式遗漏的公共方法已经这样做了?
- 如果没有,我们是否应该提出拉取请求?
【问题讨论】: