Groovy无法使用访问超类的私有属性`@`
库中有一个第三方java类。试图在Groovy类中扩展该类。我想进入那个私人财产 问题是它说 类:test2.Superuser没有这样的字段:firstName 我确信一定有办法使用groovy访问相同的属性并操纵属性值 一些帖子建议使用@before属性名来访问私有属性。但是没有运气 下面是示例代码片段 java库的第三方类Groovy无法使用访问超类的私有属性`@`,groovy,Groovy,库中有一个第三方java类。试图在Groovy类中扩展该类。我想进入那个私人财产 问题是它说 类:test2.Superuser没有这样的字段:firstName 我确信一定有办法使用groovy访问相同的属性并操纵属性值 一些帖子建议使用@before属性名来访问私有属性。但是没有运气 下面是示例代码片段 java库的第三方类 package test; class User { private String firstName; private String name() {
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的链接得到了完全相同的结果。谢谢你抽出时间回来。