詳解Java反射創(chuàng)建對象
一、什么是反射
Java Reflaction in Action中的解釋:反射是運行中的程序檢查自己和軟件運行環(huán)境的能力,它可以根據(jù)它發(fā)現(xiàn)的進行改變。通俗的講就是反射可以在運行時根據(jù)指定的類名獲得類的信息 個人理解:就是我們對于創(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)
這個方法會返回指定參數(shù)類型的所有構(gòu)造器,包括public的和非public的,當然也包括private的。getDeclaredConstructors()的返回結(jié)果就沒有參數(shù)類型的過濾了。
再來看getConstructor(Class<?>... parameterTypes)
這個方法返回的是上面那個方法返回結(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使用橋接模式實現(xiàn)開關(guān)和電燈照明功能詳解
這篇文章主要介紹了Java使用橋接模式實現(xiàn)開關(guān)和電燈照明功能,較為詳細的講述了橋接模式的概念、原理并結(jié)合實例形式分析了Java使用橋接模式實現(xiàn)開關(guān)和電燈照明功能相關(guān)操作步驟與注意事項,需要的朋友可以參考下2018-05-05
IDEA如何使用spring-Initializr快速搭建SpringBoot
這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringSecurity?默認登錄認證的實現(xiàn)原理解析
這篇文章主要介紹了SpringSecurity?默認登錄認證的實現(xiàn)原理解析,本文通過圖文示例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-12-12
簡單注解實現(xiàn)集群同步鎖(spring+redis+注解)
本文主要介紹了簡單注解實現(xiàn)集群同步鎖的步驟與方法。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01

