2016-09-09 7 views
1

ライブラリに第三者java classがあります。そのクラスをGroovy Classで拡張しようとしています。私はその私有財産にアクセスしたいと思います。Groovyが `@ 'を使用してスーパークラスのプライベートプロパティにアクセスできない

問題は、それが

を言うことは、このような場ではありません:クラスのためのfirstName:test2.Superuser

私は同じにアクセスして操作する方法がなければならないと確信していますgroovyを使用したプロパティ値。

プライベートプロパティにアクセスするには、プロパティ名の前に@を使用するように指示されている投稿があります。しかし、運がない。

サンプルコードスニペットは次のとおりです。

User.java(ライブラリのサードパーティのクラス)

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

SuperUser.groovy(私がしようとしています1)

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.javaではなくUser.groovy)であっても、動作は同じです。 – Rao

+0

を試してみてください。 Groovyアクセス修飾子は本当に混乱していて、Groovyのバージョンに依存します。 –

+0

groovy 1.8(soapUI 4.xに付属)を使用しています。私はすでにそれを試みましたが、助けにはなりませんでした。しかし、あなたの時間をありがとう。おかげさまで – Rao

1

Javaクラスは、これらのフィールド、プロパティ、およびメソッドのすべてにアクセスすることはできません。それはそれにアクセスできる他のグルーヴィースクリプトだけです。以下の例でも同じことが実証されます。

あなたはUser.groovy

.java代わり.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() 
    } 
} 

出力: - それはJava 8

groovy-all-2.4.3注意して罰金働いてJohn

: - Follow this link for more details

編集: - あなたがない場合サードパーティのコードのためにスーパークラスを変更したい場合は、試してくださいusing java reflection to access private property of a class

+0

ここに記載されていることのいくつかは、質問に記載されているように、第三者のスーパークラスを変更する特権を持っていません。そして、ソフトウェアのバージョンで質問を更新し、残念ながらバージョンをアップグレードすることはできません。また、無駄になったコード[here](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の反射のようにお勧め:

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

関連する問題