java 反射專題一

作者:殘陽丶

轉自:https://www.cnblogs.com/cainiao-Shun666/p/8555872.html

一丶Class的理解

/*

 * Class類是反射的源頭

 * 創建一個類,通過編譯(javac.exe),生成對應的.class文件,之後使用java.exe加載(JVM的類加載器完成的)此.class文件。

 * 此.class文件加載到內存後,就是一個運行時類,存放在緩存區。

 * 那麼這個運行時類本身就是一個Class的實例。

 * 1.每一個運行時類只加載一次;

 * 2.有了Class的實例後,可以進行如下操作:

 *    1>創建對應的運行時類的對象

 *    2>獲取對應的運行類的完整結構(屬性、方法、構造器、內部類、父類、所在的包、異常、註解、...)

 *    3>調用對應的運行時類指定的結構(屬性、方法、構造器)

 *    4>反射的應用:動態代理

 */

 

二丶獲得Class對象的方法

1)通過類的靜態屬性class獲得

Class clazz = Person.class;

2)通過運行時類的getClass方法獲得

Person person = new Person();
Class clazz = person.getClass();

3)通過Class的靜態方法獲得

String className = "com.reflect.Person";
Class clazz = Class.forName(className);

4)通過類的加載器獲得(瞭解)

String className = "com.reflect.Person";//類的完全限定名
ClassLoader classLoader = NioTest3.class.getClassLoader();
Class clazz = classLoader.loadClass(className);

三、通過Class對象創建對應的運行時類的實例對象

Class clazz = Person.class;//沒有使用泛型,默認是object類型的class對象
Person person = (Person) clazz.newInstance();  //需要強轉,該方法默認調用運行時類的無參構造方法,所以類必須有無參構造方法,無參構造方法權限夠大
Class<Person> clazz = Person.class;//使用了泛型指定是Person類型的class對象
Person person = clazz.newInstance();//不需要強轉

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章