質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

12789閲覧

newInstance()の引数 java

sanezane

総合スコア91

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/01/27 10:46

リフレクションを用いてメンバを直接操作する演習で、下記コード★★★★★部の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); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

java

1new ○○();

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


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

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

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

java

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

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

java

1RefSample rs = new RefSample(256);

と同じ意味になります。

投稿2018/01/27 14:33

whistyun

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanezane

2018/01/28 04:21

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

0

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

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

投稿2018/01/27 11:00

編集2018/01/27 11:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanezane

2018/01/28 04:19

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問