反射機制(三)操作構(gòu)造器

通過反射來獲取某一個類的構(gòu)造器:
1>獲取該類的字節(jié)碼對象审姓;
2>從該字節(jié)碼對象中去找需要獲取的構(gòu)造器;


Class類獲取構(gòu)造器方法:

Constructor類:
--表示類中構(gòu)造器的類型相满,Constructor的實例就是某一個類中的某一個構(gòu)造器;

public Constructor<?>[] getConstructors() ;
--該方法只能獲取當前Class所表示類的public修飾的構(gòu)造器劲腿;

public Constructor<?>[] getDeclaredConstructors();
--獲取當前Class所表示類的所有構(gòu)造器蔫劣,和訪問權(quán)限無關(guān)奕污;

public Constructor<T> getConstructor(Class<?>... parameterTypes);
--獲取當前Class所表示類中指定的一個public的構(gòu)造器

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
--獲取當前Class所表示類中指定的一個構(gòu)造器巷懈;

參數(shù):parameterTypes
--表示:構(gòu)造器參數(shù)的Class類型;


public class _0_GetConstructor {
    public static void main(String[] args) throws Exception{
//        獲取所有的構(gòu)造器
        getAlls();
//        獲取指定的一個構(gòu)造器
        getAppoint();
    }
    private static void getAlls() {
//        1.獲取構(gòu)造器所在類的字節(jié)碼對象
        Class clz = User.class;
//        2.獲取clz對象中所有的構(gòu)造器
//        該方法只能獲取當前Class所表示類的public修飾的構(gòu)造器癌蓖;
        Constructor<User>[] cons = clz.getConstructors();
        System.out.println(cons.length);//2
        for (Constructor c : cons) {
            System.out.println(c);
            //public com.reflection._1_constructor.User()
            //public com.reflection._1_constructor.User(java.lang.String)
        }
        System.out.println("------------------------------");
//        獲取當前Class所表示類的所有構(gòu)造器,和訪問權(quán)限無關(guān);
        cons = clz.getDeclaredConstructors();
        System.out.println(cons.length);//3
        for (Constructor c : cons) {
            System.out.println(c);
            //public com.reflection._1_constructor.User()
            //public com.reflection._1_constructor.User(java.lang.String)
            //private com.reflection._1_constructor.User(java.lang.String,int)
        }
    }

    public static void getAppoint() throws Exception {
        System.out.println("------------------------------");
//        1.獲取構(gòu)造器所在類的字節(jié)碼對象
        Class clz = User.class;
//        需求1:獲取public User()
        Constructor<User> con = clz.getConstructor();
        System.out.println(con);//public com.reflection._1_constructor.User()

//        需求2:獲取public User(String name)
        con = clz.getConstructor(String.class);
        System.out.println(con);

//        需求3:獲取public User(String name ,int age)
//        con = clz.getConstructor(String.class,int.class);//報錯:Exception in thread "main" java.lang.NoSuchMethodException:
//                                                                com.reflection._1_constructor.User.<init>(java.lang.String, int)
        con = clz.getDeclaredConstructor(String.class,int.class);
        System.out.println(con);
    }
}
class User{
    public User(){}

    public User(String name){}

    private User(String name ,int age){}
}

構(gòu)造器最大的作用:創(chuàng)建對象;
為什么使用反射創(chuàng)建對象而不直接使用new呢舷蟀?
在框架中,提供給我們的都是字符串其徙;
很多框架(比如Spring)都是配置化的(比如通過XML文件配置JavaBean,Action之類的)河哑,為了保證框架的通用性,它們可能需要根據(jù)配置文件加載不同的對象或類羡滑,調(diào)用不同的方法,這個時候就必須用到反射——運行時動態(tài)加載需要加載的對象泥耀。


使用反射創(chuàng)建對象

步驟:
1.找到構(gòu)造器所在類的字節(jié)碼對象蜘醋;
2.獲取構(gòu)造器對象;
3.使用反射粥航,創(chuàng)建對象杨凑;


Constructor<T>類:表示類中構(gòu)造器的類型,Constructor的實例就是某一個類中的某一個構(gòu)造器驹吮;

常用方法:

public T newInstance(Object... initarges);
-若調(diào)用帶參數(shù)的構(gòu)造器脆淹,只能使用該方式;
-參數(shù):initarges,表示調(diào)動構(gòu)造器的實際參數(shù)盗棵;
-返回:返回創(chuàng)建的實例泰涂,T表示Class所表示類的類              型僵井;

如果:一個類中的構(gòu)造器是外界可以    直接訪問的,同時沒有參數(shù)社搅,那么可以直接使用Class類中的newInstance()方法創(chuàng)建對象淌实;

-public Object newInstance();//相當于new 類名();

訪問私有的成員

-(Constructor、Method、Field):

必須先設(shè)置可訪問的:

語法:對象.setAccessible(true);
見源碼:
-public final class Constructor<T> extends Executable ...
-public abstract class Executable extends AccessibleObject{
 public static void setAccessible(AccessibleObject[] array, 
 boolean  flag)
 }

//使用反射調(diào)用構(gòu)造器所在類來創(chuàng)建其對象
public class _1_CreateObject {
    public static void main(String[] args) throws Exception{
        Class<Person> clz = Person.class;
        Person p = clz.newInstance();
        Constructor<Person> con = clz.getConstructor();
        Person instance = con.newInstance();//調(diào)用無參數(shù)構(gòu)造器

        con = clz.getConstructor(String.class);
        con.newInstance("INSOMNIA");

        con = clz.getDeclaredConstructor(String.class,int.class);
//        con.newInstance("INSOMNIA",18);//報錯留美,原因:
//Exception in thread "main" java.lang.IllegalAccessException://非法訪問異常
//Class com.reflection._1_constructor._1_CreateObject
//can not access a member of class com.reflection._1_constructor.Person with modifiers "private"
        /** 設(shè)置當前構(gòu)造器可以訪問*/
        con.setAccessible(true);//可解決上述問題;使用枚舉谎砾,即使反射也不行逢倍;
        con.newInstance("INSOMNIA",18);
    }
}
class Person{
    public Person(){
        System.out.println("調(diào)用無參數(shù)構(gòu)造器");
    }

    public Person(String name){
        System.out.println("調(diào)用有參數(shù)構(gòu)造器"+name);
    }

    private Person(String name ,int age){
        System.out.println("調(diào)用有參數(shù)構(gòu)造器"+"name = "+name+" & "+"age = "+age);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市景图,隨后出現(xiàn)的幾起案子较雕,更是在濱河造成了極大的恐慌,老刑警劉巖挚币,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郎笆,死亡現(xiàn)場離奇詭異,居然都是意外死亡忘晤,警方通過查閱死者的電腦和手機宛蚓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來设塔,“玉大人凄吏,你說我怎么就攤上這事∪蚧祝” “怎么了痕钢?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長序六。 經(jīng)常有香客問我任连,道長,這世上最難降的妖魔是什么例诀? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任随抠,我火速辦了婚禮裁着,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拱她。我一直安慰自己二驰,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布秉沼。 她就那樣靜靜地躺著桶雀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唬复。 梳的紋絲不亂的頭發(fā)上矗积,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音敞咧,去河邊找鬼棘捣。 笑死,一個胖子當著我的面吹牛妄均,可吹牛的內(nèi)容都是我干的柱锹。 我是一名探鬼主播哪自,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼丰包,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壤巷?” 一聲冷哼從身側(cè)響起邑彪,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胧华,沒想到半個月后寄症,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡矩动,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年有巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲没。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡篮迎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出示姿,到底是詐尸還是另有隱情甜橱,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布栈戳,位于F島的核電站岂傲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏子檀。R本人自食惡果不足惜镊掖,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一乃戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧堰乔,春花似錦偏化、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苟翻,卻和暖如春韵卤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崇猫。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工沈条, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诅炉。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓蜡歹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涕烧。 傳聞我的和親對象是個殘疾皇子月而,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、概述 Java反射機制定義 Java反射機制是在運行狀態(tài)中议纯,對于任意一個類父款,都能夠知道這個類中的所有屬性和方法...
    CoderZS閱讀 1,632評論 0 26
  • 一:java概述: 1,JDK:Java Development Kit瞻凤,java的開發(fā)和運行環(huán)境憨攒,java的開發(fā)...
    慕容小偉閱讀 1,774評論 0 10
  • 整理來自互聯(lián)網(wǎng) 1,JDK:Java Development Kit阀参,java的開發(fā)和運行環(huán)境肝集,java的開發(fā)工具...
    Ncompass閱讀 1,537評論 0 6
  • 喜樂操練90天——43《神秘的朋友》 你使他有洪福,直到永遠蛛壳,又使他在你面前歡喜快樂杏瞻。(詩篇21:6) 喜...
    午后的咖啡與茶閱讀 254評論 0 0
  • 文/清風遠行 深夜凌晨一點鐘,我坐在書桌的電腦前發(fā)呆炕吸,桌上的煙灰缸里已經(jīng)堆滿了煙頭伐憾。看著朋友圈里的照片你靠在一個男...
    怪馬m閱讀 1,554評論 2 7