2016-09-09 3 views
1

В библиотеке есть третье лицо java class. Попытка расширить этот класс в Groovy Class. Я хотел бы получить доступ к этой частной собственности.Groovy не может получить доступ к частной собственности суперкласса, используя `@`

Проблема заключается в том, что он говорит

Нет такого поля: Имя для класса: 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() 
     [email protected] = "John" 
     println suser.name() 
    } 
} 

Любая помощь приветствуется.

Использование ниже версий:

groovy : 1.8.0 
jdk : 1.7.0 
+1

к сожалению, я опаздываю на ваш вопрос, мне нравится пытаться помочь людям, которые действительно этого заслуживают :) – albciff

ответ

0

User.java класс Java, а не Groovy класс, так что эти переменные все еще частные (в отличие от Groovy переменных, которые всегда общедоступны другим Groovy классов).

Итак, в приведенном выше примере, если класс Java не содержит некоторых геттеров и сеттеров, вы не сможете изменять его личные члены.

+0

На самом деле нет. Даже если суперкласс является groovy (User.groovy вместо User.java), поведение такое же. – Rao

+0

попробуйте без @. Модификаторы доступа Groovy - настоящий беспорядок, и это зависит от вашей отличной версии. –

+0

Использование groovy 1.8 (поставляется с soapUI 4.x). Я уже пробовал это, но не помог. Спасибо за ваше время. – Rao

1

Классы Java не могут получить доступ ко всем этим private полях, свойствам и методам. Только другие groovy-скрипты могут получить к нему доступ. Пример ниже продемонстрирует то же самое.

Вы должны попытаться создать как имя файла класса, как .groovy вместо .java

User.groovy:

class User { 

    private String firstName; 
    private String name() { 
     firstName; 
    } 
} 

UserTest.заводной: -

class UserTest { 
    public static void main(String[] args) { 
     User user = new User(); 
     [email protected] = "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.

+0

Спасибо. Пара вещей здесь, чтобы отметить, как это упоминается в вопросе, у меня нет привилегии изменить третий класс супер-класса. И обновил вопрос с версиями программного обеспечения и, к сожалению, не может обновлять версии. А также попробовал код [здесь] (https://groovyconsole.appspot.com/script/6217687118118912), который оказался бесполезным. – Rao

+0

Тогда вы не можете достичь этого, кроме как попытаться использовать отражение, чтобы сделать частным публично принудительно, а затем использовать. Спасибо –

+0

Хорошо, интересно, можно ли это сделать через мета-программирование? – Rao

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 Reflection:

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) 

    } 
} 
+0

Некоторое я не мог обновить это позже и закончил точно так же, используя ссылку saurabh. Спасибо за ваше время для возвращения. – Rao