• ベストアンサー

Javaのリフレクションについて

A,B,二つのクラスがあり、BはAを継承しています。 そんな状態で、Aのprivate変数をリフレクションで自由に値設定し、Bクラスのインスタンスから参照することって可能でしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • Paul_xxx
  • ベストアンサー率56% (27/48)
回答No.1

うろ覚えですが、リフレクションでは、private変数は名称は、参照できますが、値の取得、設定は出来なかったはずです。 IllegalAccessExceptionが発生したと思います。 セキュリティ等も関連していたと思います。 JDK 1.4での知識なので、JDK 5.0では変わっているかもしれません。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

できないことはありませんが、その前に設計を見直したりする方が先です。 安易にprivateなフィールドを操作すると不整合が起こったりすることもありますので。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • privateのメソッドをリフレクションで呼び出す方法

    privateのメソッドをリフレクションで呼び出す方法 private のメソッドをリフレクションで呼び出す方法 privateのメソッドもリフレクションというもので呼び出せると聞きましたが、やり方がよく分かりません。 aaaやbbbクラスのインスタンスを生成したいのですが、privateやpackage privateのため、そのままだとインスタンスが生成できません。 forNameメソッドやnewInstanceメソッドでどうにかできないかと試してみたのですが、イリーガル例外が発生してしまいます。 何かよい方法がないでしょうか? aaa, bbbのクラスを継承してモックを作成する方法もあるのですが、今回はそういった方法ではなく、privateやpackage privateメソッド(特にコンストラクタ)を外部から呼び出す方法がよいです。 public aaa { private aaa() { } private func() { } } public bbb { aaa() { } private func() { } }

    • ベストアンサー
    • Java
  • JAVAの継承について

    JavaでクラスA,B,Cがあり、A,BはクラスCを継承しています。 この時にAのインスタンスを生成しCにある変数に値を設定します。 この設定した情報をBのインスタンスに一気に設定することは可能でしょうか? やりたいこととしてはAに設定した情報をBにコピーするようなイメージです。 すべてのsetterを呼びだして設定するのが面倒なので。 例)構文的に間違ってるかもしれませんがやりたいことは以下のような感じです。 A a = new A(); a.setStr("aaa"); a.setInt(5); B b = new B(); b.setStr(a.getStr()); b.setInt(a.getInt(); class A extends C{} class B extends C{} class C {  int x = 0;  String str = "";  private String setStr(String str){this.str=str;}  private String setInt(int i){this.x=i;}  private String getInt(){return this.x;}  private String getStr(){return this.str;} }

    • ベストアンサー
    • Java
  • Java リフレクションについて

    1.リフレクションを使い、値をセット(BeanのSetterメソッドにて) 2.1でセットした値を取得するために、下記コードで取得 Method Method = Class.getMethod("getLstData"); Object obj = Method.invoke(****); 上記の****の箇所には、メソッドのあるクラスのインスタンスを渡す、 というところまでは分かりますが、newInstance()してしまうと、新しいオブジェクトになってしまうので 値が取得できません。 error>>java.lang.IllegalArgumentException: object is not an instance of declaring class どのようにすれば、値の取得が可能でしょうか。 どなたかご教授いただければと思います。 ※Java 1.5を使用

    • ベストアンサー
    • Java
  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ネストしたenumへのリフレクションによるアクセス

    public class Game {   // ゲームの状態   private enum GameState{    TITLE,    PLAYING,    GAMEOVER,   }   private GameState state; } 上記のクラスに対して、JUnitのテストコードから、 メンバ変数のstateの値とenum定数 GameState.TITLEとの比較がしたいと思っています。 イメージとしては、 if(state == GameState.TITLE){ ..... } のような形です。 GameStateがprivateで宣言されているため、テストコードからはリフレクションを使用すればアクセスできるのではないかと思っているのですが、ネストしたクラスにどのようにアクセスすればよいのかがわかりません。 テストコードにて、 Game game; Class<? extends Game> c = game.getClass(); // GameState取得 Field e = c.getDeclaredField("GameState"); とすると、実行時にGameStateがないと言われてテストに失敗してしまします。 テストコードからGameStateにアクセスするにはどのようにすればよいのでしょうか?

    • ベストアンサー
    • Java
  • アンドロイドで、別のクラスのインスタンスを呼ぶ方法

    アンドロイドの場合、別のクラスのインスタンスを呼び出すにはどうしたら良いですか? どうしてもわからずとても困っています。どうかご教授下さい。 例えば、Activityを継承しているクラスAがImageViewを継承しているクラスIのインスタンスを呼び出したいとします。 通用ならクラスA内で、 ExtendsImageView myExtendsImageView = new ExtendsImageView(); なんてインスタンス変数もたせて、 myExtendsImageViewから変数なりメソッドなり呼び出せれば済む話なんですが、 アンドロイドの場合、 アプリの起動時に自動的にActivity継承クラスとImageView継承クラスのインスタンスが生成されるようです。 そしてそのインスタンスがどこにあるかわからないので、呼び出すことができません。 無理やり、 ExtendsImageView myExtendsImageView = new ExtendsImageView(); と新しくインスタンスをつくるのも変な気がします・・・。 どのようにすれば別のクラスのインスタンスを呼び出すことができるでしょうか?どうかご教授下さい。。

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • VC++/MFCでリフレクション

    Javaでは、ObjectのgetClass()でClassクラスの インスタンスが取れ、実行時に指定した、メソッド名や、引数で、動的にメソッドを呼びだすようなリフレクション機能が使用できます。 同様のことをC#でも実装したことがあります。 VC++/MFCにて、このようなリフレクションをやるやり方を教えてください。 C++の標準あるいわ、MFCの機能など、どちらでもよいです。 メタクラス型のようなものを実行時に取得して、リフレクションする方法だと思います。 質問の内容はVC++.NETやVC++/CLIではないです。そちらのほうでのやり方は既に発見しました。

  • リフレクションでフィールドのインスタンス取得

    リフレクションを使ってフィールドの型やオブジェクトのタイプ、名前などは取得できるのですが、それ自身のインスタンスを取得できません。 ClassオブジェクトのnewInstanceでは、新しく作ってしまうのでだめでした。なにかよい方法はないでしょうか? class Parent{ Foo foo1,foo2; Bar bar; } というクラスでbarからfoo1,foo2のメソッドを呼び出したいのですが、 Fooは何個定義されるかわからない状態です。 Barないでリフレクションを使ってfoo1,foo2をあらわすClassやFieldは取得できるのですが、foo1,foo2自身が取得したいのです。 よろしくお願いします

    • ベストアンサー
    • Java
このQ&Aのポイント
  • エプソンプリンターを購入したが、スキャナーとプリントCDのソフトウェアがインストールできない状況になっています。
  • 以前のエプソンプリンターが壊れ、新たにEP-883AWを購入しましたが、スキャナーとプリントCDのソフトウェアのインストールがうまくいきません。
  • EP-883AWという新しいエプソンプリンターを購入しましたが、スキャナーとプリントCDのソフトウェアをインストールできません。
回答を見る