Groovy无法使用`@`访问超类的私有属性

时间:2016-09-09 13:13:32

标签: groovy

图书馆中有第三方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

3 个答案:

答案 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 8groovy-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,否则您将无法修改它的私有成员。