詳解Java反射創(chuàng)建對(duì)象
一、什么是反射
Java Reflaction in Action中的解釋:反射是運(yùn)行中的程序檢查自己和軟件運(yùn)行環(huán)境的能力,它可以根據(jù)它發(fā)現(xiàn)的進(jìn)行改變。通俗的講就是反射可以在運(yùn)行時(shí)根據(jù)指定的類名獲得類的信息 個(gè)人理解:就是我們對(duì)于創(chuàng)建對(duì)象我們除了通過(guò) new關(guān)鍵字創(chuàng)建外,還能通過(guò)什么創(chuàng)建呢?private的屬屬性真的不能獲取嗎?反射就能做到打破這些所謂的規(guī)則反射和new創(chuàng)建對(duì)象誰(shuí)的效率高? new
二、通過(guò)類對(duì)象調(diào)用newInstance()方法,適用于無(wú)參構(gòu)造方法
2.1 類名.class
public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException { Class<Person> clazz = Person.class; Person person = clazz.newInstance(); System.out.println(person instanceof Person); // true } } class Person { private Integer age; private String name; public Person() { } }
2.2 Class.forName
public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { Class<?> clazz = Class.forName("com.best.test.Person"); Person person = (Person) clazz.newInstance(); System.out.println(person instanceof Person); // true } } class Person { private Integer age; private String name; public Person() { } }
2.3 對(duì)象名.getClass
public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException{ Person person = new Person(); Class<? extends Person> clazz = person.getClass(); Person person1 = clazz.newInstance(); System.out.println(person1 instanceof Person); // true } } class Person { private Integer age; private String name; public Person() { } }
三、getConstructor()和getDeclaredConstructor()
通過(guò)類對(duì)象的getConstructor()或getDeclaredConstructor()方法獲得構(gòu)造器(Constructor)對(duì)象并調(diào)用其newInstance()方法創(chuàng)建對(duì)象,適用于無(wú)參和有參構(gòu)造方法。
3.1 getConstructor()
public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class<Person> clazz = Person.class; Constructor<Person> ctor = clazz.getConstructor(Integer.class, String.class); Person person = ctor.newInstance(26, "jak"); System.out.println(person instanceof Person); // true } } class Person { private Integer age; private String name; public Person(Integer age, String name) { this.age = age; this.name = name; } }
3.2 getDeclaredConstructor()
public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class<Person> clazz = Person.class; Constructor<Person> ctor = clazz.getDeclaredConstructor(String.class); Person person = ctor.newInstance("jak"); System.out.println(person instanceof Person); // true } } class Person { private Integer age; private String name; public Person(Integer age, String name) { this.age = age; this.name = name; } public Person(String name) { this.name = name; } }
3.3 getConstructor()和getDeclaredConstructor()區(qū)別
getDeclaredConstructor(Class<?>... parameterTypes)
這個(gè)方法會(huì)返回指定參數(shù)類型的所有構(gòu)造器,包括public的和非public的,當(dāng)然也包括private的。getDeclaredConstructors()的返回結(jié)果就沒(méi)有參數(shù)類型的過(guò)濾了。
再來(lái)看getConstructor(Class<?>... parameterTypes)
這個(gè)方法返回的是上面那個(gè)方法返回結(jié)果的子集,只返回指定參數(shù)類型訪問(wèn)權(quán)限是public的構(gòu)造器。getConstructors()的返回結(jié)果同樣也沒(méi)有參數(shù)類型的過(guò)濾。
到此這篇關(guān)于詳解Java反射創(chuàng)建對(duì)象的文章就介紹到這了,更多相關(guān)Java反射創(chuàng)建對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于自定義類加載器實(shí)現(xiàn)熱部署過(guò)程解析
這篇文章主要介紹了Java基于自定義類加載器實(shí)現(xiàn)熱部署過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Spring?Cloud?Gateway中netty線程池優(yōu)化示例詳解
這篇文章主要介紹了Spring?Cloud?Gateway中netty線程池優(yōu)化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用
這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java 利用java反射機(jī)制動(dòng)態(tài)加載類的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇java 利用java反射機(jī)制動(dòng)態(tài)加載類的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09springboot整合webservice使用簡(jiǎn)單案例總結(jié)
WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語(yǔ)言,平臺(tái)等,可以實(shí)現(xiàn)不同的語(yǔ)言間的相互調(diào)用,下面這篇文章主要給大家介紹了關(guān)于springboot整合webservice使用的相關(guān)資料,需要的朋友可以參考下2024-07-07Java微信公眾平臺(tái)開(kāi)發(fā)(13) 微信JSSDK中Config配置
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第十三步,微信JSSDK中Config配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Spring?main方法中如何調(diào)用Dao層和Service層的方法
這篇文章主要介紹了Spring?main方法中調(diào)用Dao層和Service層的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10