生活随笔
收集整理的這篇文章主要介紹了
使用反射调用构造器创建对象
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
構(gòu)造器最大的作用:創(chuàng)建對(duì)象.
為什么使用反射創(chuàng)建對(duì)象,為什么不直接來(lái)new呢?
在框架中,提供給我們的都是字符串.
-----------------------------------------------------------
使用反射創(chuàng)建對(duì)象:
步驟:
??? 1);找到構(gòu)造器所在類的字節(jié)碼對(duì)象.
??? 2):獲取構(gòu)造器對(duì)象.
??? 3):使用反射,創(chuàng)建對(duì)象
-----------------------------------------------------------
Constructor<T>類:表示類中構(gòu)造器的類型,Constructor的實(shí)例就是某一個(gè)類中的某一個(gè)構(gòu)造器
常用方法:
publicT newInstance(Object... initargs) :如調(diào)用帶參數(shù)的構(gòu)造器,只能使用該方式.
???? 參數(shù):initargs:表示調(diào)用構(gòu)造器的實(shí)際參數(shù)
???? 返回:返回創(chuàng)建的實(shí)例,T表示Class所表示類的類型
如果:一個(gè)類中的構(gòu)造器 是外界 可以直接訪問(wèn),同時(shí)沒(méi)有參數(shù) .,那么可以直接使用Class類中的newInstance方法創(chuàng)建對(duì)象 .
?public Object newInstance():相當(dāng)于new 類名();
調(diào)用私有的構(gòu)造器:
?注意:java.lang.IllegalArgumentException: wrong number of arguments 表示如果你想獲取的構(gòu)造器為private那么通過(guò)getConstructor是會(huì)報(bào)上面的異常,改為getDeclaredConstructor
訪問(wèn)私有的成員:
必須先設(shè)置可訪問(wèn)的
對(duì)象setAccessible(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 {//獲取指定的一個(gè)構(gòu)造器public Main(){System.out.println("我是Main類無(wú)參的構(gòu)造器");}public Main(int num){System.out.println(num);}private Main(String statement){System.out.println("我是帶有一個(gè)String類型的參數(shù)的構(gòu)造器"+ statement);}private Main(String str, int num){System.out.println("我是帶有兩個(gè)參數(shù)的構(gòu)造器");}public static void main(String[] args) throws Exception {System.out.println("-----------反射調(diào)用構(gòu)造器創(chuàng)建對(duì)象----------------");//1:獲取構(gòu)造器所在類的字節(jié)碼對(duì)象Class<Main> clz = Main.class;//2:獲取clz對(duì)象中所有的構(gòu)造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射創(chuàng)建對(duì)象//由于main(String..)為私有的因此,設(shè)置訪問(wèn)權(quán)限con.setAccessible(true);String str = "hello";con.newInstance(str);}
}
練習(xí)代碼保存
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 {//獲取指定的一個(gè)構(gòu)造器public Main(){System.out.println("我是Main類無(wú)參的構(gòu)造器");}public Main(int num){System.out.println(num);}private Main(final String statement){System.out.println("我是帶有一個(gè)String類型的參數(shù)的構(gòu)造器");}private Main(String str, int num){System.out.println("我是帶有兩個(gè)參數(shù)的構(gòu)造器");}private static void getAll(){//1:獲取構(gòu)造器所在類的字節(jié)碼對(duì)象Class<Main> clz = Main.class;//2:獲取clz對(duì)象中所有的構(gòu)造器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:獲取構(gòu)造器所在類的字節(jié)碼對(duì)象Class<Main> clz = Main.class;//2:獲取clz對(duì)象中所有的構(gòu)造器//需求1:獲取public Main()Constructor<Main> 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("---------類的實(shí)例------------------");//需求1:獲取java.util.Date類的字節(jié)碼對(duì)象//方式1:使用class屬性Class<java.util.Date> clz1 =java.util.Date.class;//方式2:通過(guò)對(duì)象的getClass方法獲取,getClass是Object類中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = date.getClass();//方式3:通過(guò)Class類中的靜態(tài)方法foeName(String className)Class<?> clz3 = Class.forName("java.util.Date");System.out.println(clz1+"\n"+clz2+"\n"+clz3+"\n");System.out.println("----------獲取類的構(gòu)造器-----------------");getOne();System.out.println("-----------獲取類的所有的構(gòu)造器----------------");getAll();System.out.println("-----------反射調(diào)用構(gòu)造器創(chuàng)建對(duì)象----------------");//1:獲取構(gòu)造器所在類的字節(jié)碼對(duì)象Class<Main> clz = Main.class;//2:獲取clz對(duì)象中所有的構(gòu)造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射創(chuàng)建對(duì)象//由于main(String..)為私有的因此,設(shè)置訪問(wèn)權(quán)限con.setAccessible(true);String str = "hello";con.newInstance(str);}
}
總結(jié)
以上是生活随笔 為你收集整理的使用反射调用构造器创建对象 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。