2016-09-09 1 views
1

Es gibt eine dritte Partei java class in einer Bibliothek. Versuchen, diese Klasse in einem Groovy Class zu erweitern. Ich möchte auf dieses Privateigentum zugreifen.Groovy kann nicht auf private Eigenschaft der Superklasse zugreifen mit `@`

Das Problem ist, dass es

kein solches Feld sagt: vorName für Klasse: test2.Superuser

Ich bin sicher, es muss ein Weg sein, das gleiche für Zugriff und Manipulation der Eigenschaftswert unter Verwendung von groovy.

Einige Beiträge schlagen vor, @ vor dem Eigenschaftsnamen zu verwenden, um auf privates Eigentum zuzugreifen. Aber kein Glück.

Hier sind die Beispiel-Code-Schnipsel.

User.java (Dritte Klasse einer Bibliothek)

package test; 
class User { 
    private String firstName;  
    private String name() {  
    firstName;  
    } 
} 

SuperUser.groovy (Das eine Ich versuche)

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() 
    } 
} 

Jede Hilfe ist willkommen.

unten Versionen verwenden:

groovy : 1.8.0 
jdk : 1.7.0 
+1

leider bin ich zu spät zu deiner frage, ich versuche gerne Leuten zu helfen, die es wirklich verdienen :) – albciff

Antwort

0

User.java ist eine Java-Klasse und keine Groovy Klasse, so dass diese Variablen sind nach wie vor privat (im Gegensatz zu Groovy Variablen, die zu anderen Groovy Klassen immer öffentlich sind).

Wenn im obigen Beispiel die Java-Klasse also einige Getter und Setter nicht enthält, können Sie ihre privaten Member nicht ändern.

+0

Wirklich nicht. Selbst wenn die Superklasse groovy ist (User.groovy statt User.java), ist das Verhalten gleich. – Rao

+0

versuchen Sie ohne @. Groovy Access Modifiers sind ein echtes Chaos und es hängt irgendwie von deiner groovigen Version ab. –

+0

Verwenden von groovy 1.8 (die mit SoapUI 4.x kommt). Ich habe das schon versucht, aber nicht geholfen. Vielen Dank für Ihre Zeit. – Rao

1

Java-Klassen sind nicht in der Lage, auf alle Felder, Eigenschaften und Methoden von private zuzugreifen. Es sind nur die anderen groovigen Skripte, die darauf zugreifen können. Das folgende Beispiel zeigt das Gleiche.

sollten Sie versuchen, beide Klassendateinamen als .groovy statt .java

User.groovy zu erstellen:

class User { 

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

Usertest. groovy: -

class UserTest { 
    public static void main(String[] args) { 
     User user = new User(); 
     [email protected] = "John" 
     println user.name() 
    } 
} 

Ausgang: - John

Es funktioniert gut mit Java 8 und groovy-all-2.4.3

Hinweis: - Follow this link for more details

Herausgegeben: - Wenn Sie nicht tun Möchten Sie die Superklasse ändern, weil der Code von Drittanbietern geändert werden soll, sollten Sie versuchen, using java reflection to access private property of a class.

+0

Danke. Ein paar Dinge hier zu beachten, wie es in der Frage erwähnt wird, habe ich nicht das Privileg, die Third Party Super Class zu ändern. Und die Frage mit den Software-Versionen aktualisiert und kann leider keine Versionen aktualisieren. Und versuchte auch den Code [hier] (https://groovyconsole.appspot.com/script/6217687118118912), der vergeblich ging. – Rao

+0

Dann können Sie dies nicht erreichen, außer zu versuchen, die Reflexion zu verwenden, um öffentlich öffentlich zu machen. Danke –

+0

Ok, fragen Sie sich, ob es durch Meta-Programmierung getan werden kann? – Rao

1

Vielleicht bin ich zu spät, aber mit Ihrer Java und Groovy Version können Sie die nachfolgende Verwendung von Meta-Programmierung tun:

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) 
    } 
} 

Oder wie andere vorschlagen im traditionellen Java-Reflexion Weg:

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

Einige konnte ich später nicht aktualisieren und endete genauso mit dem Link von suarabh. Danke für deine Zeit, um zurück zu kommen. – Rao

Verwandte Themen