图书馆中有第三方java class
。试图在Groovy Class
中扩展该类。我想访问那个私有财产。
问题是它说
没有这样的字段:class的firstName:test2.Superuser
我确信必须有一种方法来访问它并使用groovy操纵属性值。
有些帖子建议在属性名称前使用@
以访问私有属性。但没有运气。
以下是示例代码段。
User.java (图书馆的第三方类)
package test;
class User {
private String firstName;
private String name() {
firstName;
}
}
SuperUser.groovy (我正在尝试的那个)
package test2
import test.User
class SuperUser extends User {
public static void main(String[] args) {
def suser = new SuperUser()
suser.@firstName = "John"
println suser.name()
}
}
感谢任何帮助。
使用以下版本:
groovy : 1.8.0
jdk : 1.7.0
答案 0 :(得分:1)
Java类无法访问所有这些private
字段,属性和方法。只有其他groovy脚本才能访问它。以下示例将演示相同的内容。
您应该尝试将这两个类文件名改为.groovy
而不是.java
User.groovy :
class User {
private String firstName;
private String name() {
firstName;
}
}
UserTest.groovy : -
class UserTest {
public static void main(String[] args) {
User user = new User();
user.@firstName = "John"
println user.name()
}
}
输出: - John
Java 8
和groovy-all-2.4.3
注意: - Follow this link for more details
已修改: - 如果您因第三方代码而不想更改超类,则应尝试using java reflection to access private property of a class。
答案 1 :(得分:1)
也许我迟到了,但是使用Java和Groovy版本,您可以使用元编程来执行以下操作:
package test2
import test.User
class SuperUser extends User {
public static void main(String[] args) {
def suser = new SuperUser()
User.metaClass.setProperty(suser,'firstName','John')
println User.metaClass.getMetaMethod('name',null).invoke(suser,null)
}
}
或者像传统的java反射方式中的其他建议一样:
package test2
import test.User
class SuperUser extends User {
public static void main(String[] args) {
def suser = new SuperUser()
def firstNameField = SuperUser.superclass.getDeclaredField('firstName')
firstNameField.setAccessible(true)
firstNameField.set(suser,"John")
def nameMethod = SuperUser.superclass.getDeclaredMethod('name')
nameMethod.setAccessible(true)
println nameMethod.invoke(suser,null)
}
}
答案 2 :(得分:0)
User.java是一个Java类而不是Groovy类,因此这些变量仍然是私有的(与Groovy变量不同,Groovy变量总是对其他Groovy类公开)。
因此,在上面的示例中,除非Java类包含一些getter和setter,否则您将无法修改它的私有成员。