上一篇文章我們專門解釋了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實例:就是運行時類
運行時類的對象:通過運行時類創建的對象。
運行時類的作用:
我們在這裏解釋一下我們上節課說的java的class類是java反射機制的基礎也就是源頭這個說法。通過Class類我們可以獲得關於一個類的相關信息
我們創建了一個類,通過編譯(javac.exe),生成對應的。class文件,之後我們使用java.exe加載(jvm的類的加載器完成的)。.class文件加載到內存中,就是一個運行時類,存在緩存區中,那麼這個運行時類本身就是一個Class的實例。裏面含有一些class類的基本信息。(還是解釋的Class clazz = Person.class;)
每一個運行時類指加載一次。
有了class實例以後,我們纔可以進行如下的操作(這些操作我們在後面用代碼的形式具體講解):
①*創建對應的運行時類的對象
②獲取對應的運行時類的完整的結構(屬性,方法,構造器,內部類,父類,所在的包,異常,註解。。。)
③調用對應的運行時類的制定的結構(屬性,方法,構造器)
④反射的應用,動態代理。
所以說java的class類是java反射的基礎。