你們好,我是Java最全面試題庫
的提褲姐,今天這篇是JavaSE系列的第十六篇,主要總結了Java中反射
相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
在運行狀態,
對於任意一個類,都能獲取這個類的全部屬性和方法,
對任意一個對象,都能調用它的任意屬性和方法。
這種動態獲取的信息及動態調用對象的方法即爲Java的反射。面試
在運行時判斷一個類所具備的成員變量和方法
在運行時判斷任意一個對象所屬的類
在運行時構造一個類的對象
在運行時調用任意一個對象的方法編程
class.forName:框架
classLoader:jvm
Class.forName(className):
內部調用的方法是 Class.forName(className,true,classloader);
第2個boolean參數表示類是否須要初始化, Class.forName(className)默認是須要初始化。
一旦初始化,就會觸發目標對象的static塊代碼執行,static參數也也會被再次初始化。spa
ClassLoader.loadClass(className):
內部調用的方法是ClassLoader.loadClass(className,false);
第2個 boolean參數,表示目標對象是否進行連接,false表示不進行連接,不進行連接意味着不進行包括初始化等一些列步驟,那麼靜態塊和靜態對象就不會獲得執行代理
靜態代理一般只代理一個類
,動態代理是代理一個接口下的多個實現類
。code
靜態代理事先知道要代理的是什麼,而動態代理不知道要代理什麼東西,只有在運行時才知道。對象
動態代理是實現 JDK 裏的 InvocationHandler
接口的 invoke 方法
,但注意的是代理的是接口,也就是你的業務類必需要實現接口,經過 Proxy 裏的 newProxyInstance 獲得代理對象。
還有一種動態代理 CGLIB,代理的是類,不須要業務類繼承接口,經過派生的子類來實現代理。經過在運行時,動態修改字節碼達到修改類的目的。繼承
AOP 編程就是基於動態代理實現的,好比著名的 Spring 框架、Hibernate 框架等等都是動態代理的使用例子。
一、根類加載器(Bootstrap
) --C++寫的 ,看不到源碼
二、擴展類加載器(Extension
) --加載位置 :jre\lib\ext
中
三、系統(應用)類加載器(System\App
) --加載位置 :classpath
中 四、自定義加載器(必須繼承 ClassLoader
)
Class.forName("com.hcx.load")
)String.class
"hello".getClass()
Class.forName("java.lang.String")