Groovy中的超级类的现场访问

Jak*_*ski 5 groovy

在Groovy中,有一个@可以直接进行现场访问的操作员。但是,它似乎不适用于在超类中声明的字段。考虑两个Java(不是Groovy)类:

class Entity {
  private Long id;

  Long getId() {
    return id;
  }
}

class User extends Entity {
}
Run Code Online (Sandbox Code Playgroud)

然后在Groovy中调用直接访问

User user = new User();
user.@id = 1L
Run Code Online (Sandbox Code Playgroud)

最终出现异常: groovy.lang.MissingFieldException: No such field: id for class User

当我尝试使用标准的访问user.id = 1L,我得到groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: id for class User

是否可以访问超类中声明的字段?

Fra*_*cía 5

您可能需要将该属性声明为受保护的:

class Entity {
  protected Long id;

  Long getId() {
    return id * 2;
  }
}

class User extends Entity {
}

User user = new User();
user.@id = 1L

assert user.@id == 1L
assert user.id == 2L
Run Code Online (Sandbox Code Playgroud)

这是直接访问字段运算符的修改示例。


Tod*_*one 5

您可以通过常规 J​​ava 反射进行访问,但我不确定如何使其更“Groovy”。

User user = new User()
fields = user.getClass().superclass.declaredFields
idField = fields[0]
idField.accessible = true
idField.set(user, 2L)
println idField.get(user)
Run Code Online (Sandbox Code Playgroud)

  • 是的,我很惊讶我还没有看到更“Groovy”的解决方案。令人失望。我能做的最好的事情是删除一些“set”和“get”前缀以及一些括号。真的?!!! (2认同)