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. }