newInstance()の引数 java

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,699

sanezane

score 73

リフレクションを用いてメンバを直接操作する演習で、下記コード★★★★★部のnewInstance()の引数256の意味がわかりません。演習の前ではnewInstance()は引数なしでnewする。と書いてあり、ググってみてもイマイチ理解ができません。数値を変えても実行時に特に変化は見られず何をしているのか、、、どなたか解説していただけないでしょうか。

public class RefSample {
    public int times = 0;
    public RefSample(int t) {
        this.times = t;
    }

    public void hello(String msg) {
        this.hello(msg,this.times);
    }
    public void hello(String msg,int t) {
        System.out.println("Hello," + msg + "x" + t);
    }

}

import java.lang.reflect.*;
public class Main {

    public static void main(String[] args) throws Exception {
        // TODO 自動生成されたメソッド・スタブ


        Class clazz = RefSample.class;   //RefSampleより情報を取得する

        //引数一つのコンストラクタを取得し、インスタンスを生成する
        Constructor<?> cons = clazz.getConstructor(int.class);/*public void hello(String msg) {
        this.hello(msg,this.times);
    }*/
★★★★★        RefSample rs = (RefSample) cons.newInstance(256);

        //pubフィールドに関するFieldを取得して読み書き
        Field f = clazz.getField("times");
        f.set(rs, 2);                  //rsのtimesに代入
        System.out.println(f.get(rs));//rsのtimesを取得

        //引数二つのhelloメソッドを取得して呼び出す
        Method m = clazz.getMethod("hello", String.class,int.class);
        m.invoke(rs, "reflection!",128);/*public void hello(String msg,int t) {
        System.out.println("Hello," + msg + "x" + t); */

        //クラスやメソッドへの修飾(publicやfinalの有無)を調べる
        boolean pubc = Modifier.isPublic(clazz.getModifiers());
        boolean finm = Modifier.isFinal(clazz.getModifiers());
        System.out.println(pubc);
        System.out.println(finm);

    } 

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

まず、newInstanceですが、これはインスタンス生成の

new ○○();


と同じことをしています。
通常のjavaコードでは、○○の箇所は自由に変えることができませんが、
リフレクションを使用することで、〇〇の内容をClassオブジェクトで表現し、
newInstanceメソッドでインスタンス生成ができます。


しかし、投稿されたコードのRefSampleクラスはコンストラクタにint型の引数を持ちます。
引数なしのnewInstanceでは、引数なしのコンストラクタを使用しようとしエラーとなるので、

  1. RefSampleクラスにint型の引数を持つコンストラクタを探す
  2. 1.で見つけたコンストラクタに、実際に渡したい値を指定してインスタンス生成を行う。

といった手順が必要となります。そのため、コードでは

// 1. RefSampleクラスにint型の引数を持つコンストラクタを探す
Constructor<?> cons = clazz.getConstructor(int.class);
// 2. 1.で見つけたコンストラクタに、実際に渡したい値を指定してインスタンス生成を行う。
RefSample rs = (RefSample) cons.newInstance(256);

となっています。これは、リフレクションを使用しない場合は、

RefSample rs = new RefSample(256);

と同じ意味になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/28 13:21

    ご丁寧に解説いただき誠にありがとうございます。newInstance()は引数なしで使うモノだと勘違いしていました。引数なしのインスタンスを生成するのですね!
    とても助かりました!

    キャンセル

+1

Constructor<?> cons = clazz.getConstructor(int.class);
RefSample rs = (RefSample) cons.newInstance(256);
// RefSample rs = new RefSample(256)

こんな感じにマッピングされるのが理解できればわかるかな?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/28 13:19

    newInstance()に引数を渡すことも可能なのですね!理解できました!ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる