Java访问Kotlin属性
Kotlin 属性会编译成以下 Java 元素:
- 一个 getter 方法,名称通过加前缀
get算出; - 一个 setter 方法,名称通过加前缀
set算出(只适用于var属性); - 一个与属性名称相同的私有字段。
例如,下面的Kotlin类:
1. class Department {
2. var id: Long = -1L
3. var name: String = "Dept"
4. }
会被编译成对应的 Java 代码:
1. public final class Department {
2. private long id = -1L;
3. @NotNull
4. private String name = "Dept";
6. public final long getId() {
7. return this.id;
8. }
10. public final void setId(long var1) {
11. this.id = var1;
12. }
14. @NotNull
15. public final String getName() {
16. return this.name;
17. }
19. public final void setName(@NotNull String var1) {
20. Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
21. this.name = var1;
22. }
23. }
我们可以看出,在Kotlin中的Long类型被编译成Java中的原生的long了。 我们在Java代码这样调用:
1. @RunWith(JUnit4.class)
2. public class JavaCallingKotlinCodeTest {
3. @Test
4. public void testProperty() {
5. Department d = new Department();
6. d.setId(1);
7. d.setName("技术部");
9. Assert.assertTrue(1 == d.getId());
10. Assert.assertTrue("技术部".equals(d.getName()));
12. }
13. }
另外,如果Kotlin的属性名以 is 开头,则使用不同的名称映射规则:
- getter 的名称直接使用属性名称
- setter 的名称是通过将
is替换为set获得。
例如,对于属性 isOpen,其 getter 会称做 isOpen(),而其 setter 会称做 setOpen()。
这一规则适用于任何类型的属性,并不仅限于 Boolean。
代码示例:
Kotlin代码
1. class Department {
2. var id: Long = -1L
3. var name: String = "Dept"
4. var isOpen:Boolean = true
5. var isBig:String = "Y"
6. }
Java调用Kotlin的测试代码:
1. @Test
2. public void testProperty() {
3. Department d = new Department();
4. d.setId(1);
5. d.setName("技术部");
6. d.setBig("Y");
7. d.setOpen(true);
9. Assert.assertTrue(1 == d.getId());
10. Assert.assertTrue("技术部".equals(d.getName()));
11. Assert.assertTrue("Y".equals(d.isBig()));
12. Assert.assertTrue(d.isOpen());
14. }
