例如,这是一个Java类
public class Thing {
...
public int thing;
public int getThing() { return thing; }
public void setThing(int t) { thing = t; }
}
在Kotlin中,如果我想访问thing
,请执行以下操作:
val t = Thing()
t.thing // get
t.thing = 42 //set
在反编译的Kotlin字节码中,我看到的是Kotlin使用getter和setter:
t.getThing()
t.setThing(42)
我想知道是否有一种方法可以直接访问字段t.thing
而不是使用getter和setter吗?
答案 0 :(得分:1)
我不确定您正在查看的字节码是否为您提供了完整的解释。
我修改了您的测试类,为基础字段赋予100
和getThing()
不同的行为:
setThing()
然后在运行此Kotlin代码时:
public class Thing {
public int thing;
public int getThing() { return thing + 1; }
public void setThing(int t) { thing = 0; }
}
我得到:
fun main() {
val t = Thing()
t.thing = 1
println(t.thing)
println(t.getThing())
t.setThing(1)
println(t.thing)
println(t.getThing())
}
这表明1
2
0
1
实际上是直接获取和设置该字段。
答案 1 :(得分:0)
您可以直接从Kotlin代码访问Java字段。因此,如果没有吸气剂,您仍然可以访问t.thing
。
但是我认为当您有吸气剂时,不可能访问该字段。如果您无法编辑Java代码,但仍想直接访问该字段(以避免在getter或其他方面产生副作用),则可以使用另一个Java类来实现。这样,您可以管理对字段的访问。
public class AnotherThing {
...
public Thing thing;
public getField() { return thing.thing; }
}