Reflection--運行時類的創建

   上一篇文章我們專門解釋了Class  clazz = Person.class;我們說最後生成了一個person.class文件。這個文件就是運行時類。這篇主要介紹運行時類的4種生成方式。


獲取class實例的四種方法:

1前提:若已知具體的類,通過類的class屬性獲取,該方法最爲安全可靠,程序性能最高

      實例:Class clazz = Personn.class;

2前提:已知某個類的實例,調用該實例的getClass()方法獲Class對象

      實例:Class clazz = “www.atguigu.com”.getClass();

3前提:已知一個類的全類名,且該類在類路徑下,可通過 Class類的靜態方法forName()獲取,可能拋出ClassNotFoundException

      實例:Class clazz = Class.forName(“java.lang.String”);

4)其他方式(不做要求)

ClassLoader cl = this.getClass().getClassLoader();

Class clazz4 = cl.loadClass(“類的全類名”);


 


優缺點:方法1在編譯的時候就告訴你這個文件找到還是找不到。方法三只能在運行的時候才能知道這個文件在不在。但是方法3是比較靈活的,根據傳進來的字符串來動態的訪問。


注意概念區分:

類,運行時類,class實例,運行時類的對象的概念,

類是一個靜態的概念,指我們編寫好的代碼的類。

運行時類:編譯好的類加載到內存中就是我們生成的.class文件。

class實例:就是運行時類

運行時類的對象:通過運行時類創建的對象。



運行時類的作用:

  我們在這裏解釋一下我們上節課說的javaclass類是java反射機制的基礎也就是源頭這個說法。通過Class類我們可以獲得關於一個類的相關信息

  我們創建了一個類,通過編譯(javac.exe,生成對應的。class文件,之後我們使用java.exe加載(jvm的類的加載器完成的)。.class文件加載到內存中,就是一個運行時類,存在緩存區中,那麼這個運行時類本身就是一個Class的實例。裏面含有一些class類的基本信息。(還是解釋的Class clazz = Person.class;

每一個運行時類指加載一次。

有了class實例以後,我們纔可以進行如下的操作(這些操作我們在後面用代碼的形式具體講解):

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

②獲取對應的運行時類的完整的結構(屬性,方法,構造器,內部類,父類,所在的包,異常,註解。。。)

③調用對應的運行時類的制定的結構(屬性,方法,構造器)

④反射的應用,動態代理。


所以說java的class類是java反射的基礎。


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