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";
  5. public final long getId() {
  6. return this.id;
  7. }
  8. public final void setId(long var1) {
  9. this.id = var1;
  10. }
  11. @NotNull
  12. public final String getName() {
  13. return this.name;
  14. }
  15. public final void setName(@NotNull String var1) {
  16. Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
  17. this.name = var1;
  18. }
  19. }

我们可以看出,在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("技术部");
  8. Assert.assertTrue(1 == d.getId());
  9. Assert.assertTrue("技术部".equals(d.getName()));
  10. }
  11. }

另外,如果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);
  8. Assert.assertTrue(1 == d.getId());
  9. Assert.assertTrue("技术部".equals(d.getName()));
  10. Assert.assertTrue("Y".equals(d.isBig()));
  11. Assert.assertTrue(d.isOpen());
  12. }