日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用反射调用构造器创建对象

發(fā)布時(shí)間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用反射调用构造器创建对象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

構(gòu)造器最大的作用:創(chuàng)建對(duì)象.

為什么使用反射創(chuàng)建對(duì)象,為什么不直接來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)造器是外界可以直接訪問,同時(shí)沒有參數(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那么通過getConstructor是會(huì)報(bào)上面的異常,改為getDeclaredConstructor

訪問私有的成員:

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

對(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類無參的構(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è)置訪問權(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類無參的構(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:通過對(duì)象的getClass方法獲取,getClass是Object類中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = date.getClass();//方式3:通過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è)置訪問權(quán)限con.setAccessible(true);String str = "hello";con.newInstance(str);} }

總結(jié)

以上是生活随笔為你收集整理的使用反射调用构造器创建对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。