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

Groovy无法使用访问超类的私有属性`@`,groovy,Groovy,库中有一个第三方java类。试图在Groovy类中扩展该类。我想进入那个私人财产 问题是它说 类:test2.Superuser没有这样的字段:firstName 我确信一定有办法使用groovy访问相同的属性并操纵属性值 一些帖子建议使用@before属性名来访问私有属性。但是没有运气 下面是示例代码片段 java库的第三方类 package test; class User { private String firstName; private String name() {

库中有一个第三方java类。试图在Groovy类中扩展该类。我想进入那个私人财产

问题是它说

类:test2.Superuser没有这样的字段:firstName

我确信一定有办法使用groovy访问相同的属性并操纵属性值

一些帖子建议使用@before属性名来访问私有属性。但是没有运气

下面是示例代码片段

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

java是一个java类而不是Groovy类,因此这些变量仍然是私有的,而Groovy变量总是对其他Groovy类公开的


因此,在上面的示例中,除非Java类包含一些getter和setter,否则您将无法修改它的私有成员。

User.Java是一个Java类而不是Groovy类,因此这些变量仍然是私有的,而Groovy变量总是对其他Groovy类公开


因此,在上面的示例中,除非Java类包含一些getter和setter,否则您将无法修改它的私有成员。

Java类无法访问所有这些私有字段、属性和方法。只有其他groovy脚本才能访问它。下面的示例将演示相同的情况

您应该尝试将这两个类文件名都创建为.groovy,而不是.java

User.groovy:

UserTest.groovy:-

输出:-约翰

它在Java8和groovy-all-2.4.3中运行良好

注:-


编辑:-如果您不想因为第三方代码而更改超类,您应该尝试。

Java类无法访问所有这些私有字段、属性和方法。只有其他groovy脚本才能访问它。下面的示例将演示相同的情况

您应该尝试将这两个类文件名都创建为.groovy,而不是.java

User.groovy:

UserTest.groovy:-

输出:-约翰

它在Java8和groovy-all-2.4.3中运行良好

注:-


编辑:-如果您不想因为第三方代码而更改super类,您应该尝试。

也许我迟到了,但对于您的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)

    }
}

也许我迟到了,但使用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)

    }
}


真的没有。即使超级类是groovy User.groovy而不是User.java,行为也是一样的。Groovy访问修饰符非常混乱,这取决于您的Groovy版本。我已经试过了,但没有帮助。谢谢你抽出时间,真的没有。即使超级类是groovy User.groovy而不是User.java,行为也是一样的。Groovy访问修饰符非常混乱,这取决于您的Groovy版本。我已经试过了,但没有帮助。谢谢你抽出时间,谢谢。这里有几件事需要注意,就像问题中提到的,我没有特权更改第三方超级类。并用软件版本更新了问题,很遗憾无法升级版本。并且还尝试了无效的代码。那么你不能做到这一点,除非尝试使用反射强制将私有化为公共,然后使用。ThanksOk,想知道是否可以通过元编程来实现吗?你们可以在这里使用反射将私有字段强制公开,然后使用Thanks。这里有几件事需要注意,就像问题中提到的,我没有特权更改第三方超级类。并用软件版本更新了问题,很遗憾无法升级版本。并且还尝试了无效的代码。那么你不能做到这一点,除非尝试使用反射强制将私有化为公共,然后使用。谢谢,想知道这是否可以通过元编程实现吗?你可以在这里使用反射,将私有领域强制公开,然后使用。不幸的是,我迟了回答你的问题,我想尝试帮助真正值得的人:不幸的是,我迟了回答你的问题,我喜欢尝试帮助那些真正值得帮助的人:有些人我后来无法更新,最后使用saurabh的链接得到了完全相同的结果。感谢您抽出时间回来。有些我以后无法更新,最后使用saurabh的链接得到了完全相同的结果。谢谢你抽出时间回来。