詳解Java反射創(chuàng)建對象
一、什么是反射
Java Reflaction in Action中的解釋:反射是運(yùn)行中的程序檢查自己和軟件運(yùn)行環(huán)境的能力,它可以根據(jù)它發(fā)現(xiàn)的進(jìn)行改變。通俗的講就是反射可以在運(yùn)行時(shí)根據(jù)指定的類名獲得類的信息 個(gè)人理解:就是我們對于創(chuàng)建對象我們除了通過 new關(guān)鍵字創(chuàng)建外,還能通過什么創(chuàng)建呢?private的屬屬性真的不能獲取嗎?反射就能做到打破這些所謂的規(guī)則反射和new創(chuàng)建對象誰的效率高? new
二、通過類對象調(diào)用newInstance()方法,適用于無參構(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 對象名.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()
通過類對象的getConstructor()或getDeclaredConstructor()方法獲得構(gòu)造器(Constructor)對象并調(diào)用其newInstance()方法創(chuàng)建對象,適用于無參和有參構(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é)果就沒有參數(shù)類型的過濾了。
再來看getConstructor(Class<?>... parameterTypes)
這個(gè)方法返回的是上面那個(gè)方法返回結(jié)果的子集,只返回指定參數(shù)類型訪問權(quán)限是public的構(gòu)造器。getConstructors()的返回結(jié)果同樣也沒有參數(shù)類型的過濾。
到此這篇關(guān)于詳解Java反射創(chuàng)建對象的文章就介紹到這了,更多相關(guān)Java反射創(chuàng)建對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解
這篇文章主要介紹了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能,較為詳細(xì)的講述了橋接模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能相關(guān)操作步驟與注意事項(xiàng),需要的朋友可以參考下2018-05-05
IDEA如何使用spring-Initializr快速搭建SpringBoot
這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
基于Spring-AOP實(shí)現(xiàn)自定義分片工具詳解
隨著數(shù)據(jù)量的增長,在與其他系統(tǒng)交互時(shí),批量接口會(huì)出現(xiàn)超時(shí)現(xiàn)象,發(fā)現(xiàn)原批量接口在實(shí)現(xiàn)時(shí),沒有做分片處理。由于與其他系統(tǒng)交互比較多,一個(gè)一個(gè)接口去做分片優(yōu)化,改動(dòng)量較大,所以考慮通過AOP解決此問題,感興趣的可以了解一下2022-11-11
SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析
這篇文章主要介紹了SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析,本文通過圖文示例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常...2006-12-12
簡單注解實(shí)現(xiàn)集群同步鎖(spring+redis+注解)
本文主要介紹了簡單注解實(shí)現(xiàn)集群同步鎖的步驟與方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
Spring常見錯(cuò)誤之Web嵌套對象校驗(yàn)失效解決辦法
這篇文章主要介紹了Spring常見錯(cuò)誤之Web嵌套對象校驗(yàn)失效解決的相關(guān)資料,通過在Phone對象上添加@Valid注解,問題得以解決,需要的朋友可以參考下2025-01-01

