scala->;java getField().get()

scala->;java getField().get(),java,android,scala,reflection,Java,Android,Scala,Reflection,所以我试图缩短我的android项目R调用,基本上是为了减少与R相关的代码 对象应用程序扩展应用程序{ 定义字符串(字段:字符串):字符串={ this.getResources().getString(R.string.getClass().getField(field.get())} } 要更改App.getResources().getString(R.string.someAndroidValueString) 至App.string(“someAndroidValueString”)

所以我试图缩短我的android项目R调用,基本上是为了减少与R相关的代码

对象应用程序扩展应用程序{
定义字符串(字段:字符串):字符串={
this.getResources().getString(R.string.getClass().getField(field.get())}
}
要更改App.getResources().getString(R.string.someAndroidValueString) 至
App.string(“someAndroidValueString”)

是的,这并不是很短,但从那里我可以创建一些traits,这样模型类就应该只定义method resourceName(),并且在任何地方都不会调用R(我想traits除外)

我可以从R.string.declaredField中获取声明的字段(感谢下面的注释),但是根据get in
field.get()的参数,我会遇到很多错误

为了让这个想法发挥作用,我需要从该字段中获取值


我错过什么了吗

我想怎么做就怎么做。 困扰我的是get争论。据我所知,参数应该是一个实例,同一对象类的任何实例,我想得到字段的值。 所以答案是:

this.getResources().getString(
    classOf[R.string].getDeclaredField(fieldName).getInt(classOf[R].newInstance()))

有了这些,我得到了我想要的东西。

如果你的目标是严格减少样板文件,那么就使用导入。您不会丢失类型检查,也不会冒字符串中键入错误的风险

import App.getResources._
import R.string._
getString(someAndroidValueString)

无法100%确定第一次导入是否有效,因为我不知道什么是
getResources
,但请尝试。

不是我的字段,而是
getField
返回公共字段,
getDeclaredField
将包含您的私有scala字段。这解决了一半问题!!感谢现在等待另一半:在你走这条路之前,请想一想。看起来您正在从显式引用
R
字段切换到通过字符串间接引用它们。如果您在方法中键入“someAdroidValueString”,会发生什么情况?您的意思是我可能拼错了字符串,然后我会听到砰的一声!在应用程序中?是的,我知道用这种方式使用弦是危险的。我只是想从trait中提取一些代码,这样模型类就可以实现myResName之类的东西,然后就再也看不到与R相关的代码了。这不是解决方案,但这是我唯一想到的。是的,没错,很高兴你明白了我的意思!因此,问题实际上在于减少与
R
相关的样板代码。如果您可以编辑您的问题以符合此要求,即描述当前使用场景
R
和所需效果,则可能更容易得到您需要的答案。此外,在回复非作者的评论时,请使用“@”。我只是偶然看到你的回复。几乎,someAndroidValueString仍然是一个变量,我不能用字符串来概括它。我一直在寻找的是getString(“someAndroidValue”),这个解决方案的问题是,现在,我可以将任何对象传递给getInt(),但我仍然可以让它工作,而一天前,同样的代码不工作,所以我认为这也不是正确的方法