反射呼び出しコンストラクタを使ってオブジェクトを作成します.

4715 ワード

コンストラクタの最大の役割:オブジェクトを作成します.
なぜ反射を使ってオブジェクトを作るのですか?なぜ直接newに来ないですか?
フレームの中で、提供してくれるのは文字列です.
-------------------------------------------
反射を使ってオブジェクトを作成:
ステップ:
    1)コンストラクタのクラスのバイトコードのオブジェクトが見つかりました.
    2):コンストラクタオブジェクトを取得します.
    3):反射を使ってオブジェクトを作成する
-------------------------------------------
コンストラクタ類:クラスのコンストラクタのタイプを表します.コンストラクタの例はある種類の中のあるコンストラクタです.
常用方法:
publicT newInstance(Object...initargs):パラメータ付きのコンストラクタを呼び出すなら、この方式しか使えません.
     パラメータ:initargs:呼び出しの実際のパラメータを表します.
     は、作成したインスタンスを返します.Tはクラスのタイプを表します.
一つのクラスの中のコンストラクタは外部から直接にアクセスできます.パラメータがない場合、直接にClassクラスのnewInstanceを使ってオブジェクトを作成できます.
 public Object newInstance():newクラス名に相当します();
プライベートのコンストラクタを呼び出します.
 注意:java.lang.Illegel Argent Exception:wrong number of argmentsは、あなたが取得したいコンストラクタがprvateであれば、get Contstructを通じて上記の異常を報告し、get Declared Contuctorに変更すると述べています.
プライベートのメンバーにアクセス:
先にアクセス可能なものを設定しなければなりません.
対象setAccess ible(true)
コード:
package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;


public class Main {
	//          
	public Main(){
		System.out.println("  Main       ");
	}
	public Main(int num){
		System.out.println(num);
	}
	private Main(String statement){
		System.out.println("      String         "+ statement);
	}
	private Main(String str, int num){
		System.out.println("            ");
	}


	public static void main(String[] args) throws Exception {

		System.out.println("-----------           ----------------");
		//1:              
		Class
clz = Main.class; //2: clz Constructor
con = clz.getDeclaredConstructor(String.class); //3. // main(String..) , con.setAccessible(true); String str = "hello"; con.newInstance(str); } }
練習コードの保存
package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;


public class Main {
	//          
	public Main(){
		System.out.println("  Main       ");
	}
	public Main(int num){
		System.out.println(num);
	}
	private Main(final String statement){
		System.out.println("      String         ");
	}
	private Main(String str, int num){
		System.out.println("            ");
	}
	private static void getAll(){
		//1:              
		Class
clz = Main.class; //2: clz Constructor>[] cs = clz.getConstructors(); System.out.println(cs.length); for (Constructor> c : cs) { System.out.println(c); } cs = clz.getDeclaredConstructors(); System.out.println(cs.length); for(Constructor> c : cs){ System.out.println(c); } } private static void getOne() throws NoSuchMethodException, SecurityException{ //1: Class
clz = Main.class; //2: clz // 1: public Main() Constructor
con = clz.getConstructor(); System.out.println(con); // 2: public Main(String statement) con = clz.getDeclaredConstructor(String.class); System.out.println(con); // 3: private Main(String str, int num) con = clz.getDeclaredConstructor(String.class, int.class); System.out.println(con); } public static void main(String[] args) throws Exception { System.out.println("--------- ------------------"); // 1: java.util.Date // 1: class Class clz1 =java.util.Date.class; // 2: getClass ,getClass Object java.util.Date date = new java.util.Date(); Class> clz2 = date.getClass(); // 3: Class foeName(String className) Class> clz3 = Class.forName("java.util.Date"); System.out.println(clz1+"
"+clz2+"
"+clz3+"
"); System.out.println("---------- -----------------"); getOne(); System.out.println("----------- ----------------"); getAll(); System.out.println("----------- ----------------"); //1: Class
clz = Main.class; //2: clz Constructor
con = clz.getDeclaredConstructor(String.class); //3. // main(String..) , con.setAccessible(true); String str = "hello"; con.newInstance(str); } }