上一篇:Class類對象的三種實例化模式 | 帶你學《Java語言高級特性》之八十一
【本節目標】
通過實際開發中的案例進行程序的說明,來進一步理解反射的核心意義。
經過一系列分析之後可以發現雖然獲得了Class類的實例化對象,但是依然覺得這個對象獲取的意義不是很大,所以為了進一步理解反射的核心意義,下面將通過幾個案例進行程序的說明(都是實際開發中一定會使用到的)。
反射實例化對象
獲取Class對象後最大意義實際上並不是在於只是一個對象的實例化操作形式,更重要的是Class類中提供了一個對象的反射實例化方法(代替了關鍵字new):
在JDK1.99以前的實例化:
@Deprecated(since="9")
public T newInstance() throws InstantiationException, IllegalAccessException
在JDK1.9之後的實例化:
clazz.getDeclaredConstructor().newInstance()
範例:通過newInstance()方法實例化Person類對象
package cn.mldn.vo;
public class Person {
//任何情況下如果要實例化類對象,一定要調用類中的構造方法
public Person(){ //無參構造方法
System.out.println("*********** Person類構造方法 ************");
}
@Override
public String toString() {
return "我是一個人,一個脫離了低級趣味的好人!";
}
}
package cn.mldn.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls=Class.forName("cn.mldn.vo.Person");
Object obj= cls.newInstance(); //實例化對象,JDK1.9後被廢除了
System.out.println(obj); //輸出對象調用toString()方法
/**
* *********** Person類構造方法 ************
* 我是一個人,一個脫離了低級趣味的好人!
*/
}
}
現在通過反射實現的對象實例化處理,依然要調用類中的無參構造方法,其本質等價於“類 對象 = new 類()”,相當於隱含了關鍵字new,而直接使用字符串進行了替代。
範例:使用getDeclaredConstructor().newInstance()進行對象實例化
package cn.mldn.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls=Class.forName("cn.mldn.vo.Person");
Object obj= cls.getDeclaredConstructor().newInstance(); //實例化對象,JDK1.9廢除了
System.out.println(obj);
/**
* *********** Person類構造方法 ************
* 我是一個人,一個脫離了低級趣味的好人!
*/
}
}
從JDK1.9後,newInstance()被替代了,因為默認的Class類中的newInstance()方法只能調用無參構造,所以很多開發者會認為其描述的不準確,於是將其變換了形式(構造方法會講解)。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本內容視頻來源於阿里雲大學