2016-03-24 17 views
0

クラスAを変更することはできませんが、コンストラクタで 'a'の値を取得する必要があります。それを行う方法を教えてもらえますか?他のすべてのソリューションは、私はどのような方法でクラスAに変更を加えることが許されていないです、ない公共などに変更する魔法はクラスBjava:getterを設定せずに別のクラスからプライベート変数を取得する

public class A{ 
    private int a; 
    public A(int x){ 
     a = x * 10; 
    } 
} 

public class B{ 
    public B(int x){ 
     A instA = new A(x); 
    } 

    public int geta(){ 
     ??? 
    } 
} 

PSで発生しているクラスAにゲッターを提案するようです:この質問を投稿しました。なぜなら、すべての類似の質問はクラスAを変更して回答されたのに対して、私は許可されていないからです。しかし、唯一の反射であるように見えるので、この質問は閉鎖することができます。おかげでみんなとギャル。

+0

メンバ変数がプライベートである場合、外部にアクセスする唯一の方法はいくつかの方法です... –

+3

Aにゲッターを追加することはできませんが、Aを何らかの形で変更することはできますか?もしあなたがそうであれば、 'private int a;'を 'public int a;'に変更する可能性があります。また、ゲッターを追加できない理由を明記してください。 –

+4

参照:http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java –

答えて

0

最高の決定はゲッタを持つことです。ベストプラクティスのプログラミングについては、最も安全でクリーンなソリューションです。

それはあなたがリフレクションを使用して欲しいものを達成することが可能です - あなたは名前でフィールドを見つけることができます(どのようなクラスの将来のバージョンで名前が変更された場合?)と抽出物は、それがこのような値だ:

A a = new A(5); 
Field field = A.getField("a"); 
field.setAccessible(true); 
int value = field.get(a); 

しかし、これはスーパーハッキーと考えられており、強くアドバイスしています。

+0

部分一致ですが、フィールドにアクセスする前にもう1行追加する必要があります。 'field.setAccessible(true); ' – Aliaxander

+0

@Aliaxanderそれが本当です。 –

2

これは、プライベートフィールドの全体のポイントです。彼らは囲むクラスの範囲外にアクセスすることはできません。

あなただ次のオプション:

  1. 変更
  2. がその値を必要としないのいずれかに、あなたの全体的なデザインを変更ゲッターを提供するために、そのクラス。使用リフレクションここで、実行時に
+0

ありがとうございます。私はプライベートフィールドのポイントを理解しています。私はエクササイズの文言が間違っていると思います。私は反射が私たちが使うはずの解決策だとは思わない。私は誰かがここで私がちょうど見ることができなかった解決策を指し示すことを望んでいた。私は、与えられたメソッドを変更することは許されていないと思うが、いくつか追加する。そうでなければ、リフレクションだけがあるようだ... – Peter

0

を「プライベート」の保護を上書きする能力は、あなたがそれを

public int geta(){ 
     Field field; 
     int x = 0; 
     try { 
      field = A.class.getDeclaredField("a"); 
      field.setAccessible(true); 
      x = field.getInt(this.a); 
     } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    System.out.println(x); 
    return x; 
} 
を行うことができる方法です:またはそれは両方のクラス
  • に利用できる推奨しないようにする別の方法を見つけます
  • 関連する問題