在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
是否可以访问超类中声明的字段?
您可能需要将该属性声明为受保护的:
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)
这是直接访问字段运算符的修改示例。
您可以通过常规 Java 反射进行访问,但我不确定如何使其更“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)
| 归档时间: |
|
| 查看次数: |
2959 次 |
| 最近记录: |