一、Java中的反射
????1.說說你對Java中反射的理解? ? ? ?
? ? ? ? ? ? java中的反射首先是能夠獲取到Java中要反射類的字節(jié)碼,獲取字節(jié)碼有三種方法。
? ? ? ? ? ? ? ? ? ? ? ? 1.Class.forName(className)?
? ? ? ? ? ? ? ? ? ? ? ? 2.類名.class
? ? ? ? ? ? ? ? ? ? ? ? 3.this.getClass。然后將字節(jié)碼中的方法,變量,構(gòu)造函數(shù)等映射成相應(yīng)Method.Filed.Constructor等類
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這些類提供了豐富的方法可以被我們使用
二、Java中的動態(tài)代理
1.動靜代理的區(qū)別,什么場景使用
? ? ? ? ? ? 靜態(tài)代理通常只代理一個類,動態(tài)代理是代理一個接口下的多個實現(xiàn)類
? ? ? ? ? ? 靜態(tài)代理事先知道代理的是什么,而動態(tài)代理不需要知道代理什么東西,只有在運行時才知道
? ? ? ? ? ? 動態(tài)代理是實現(xiàn)JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是業(yè)務(wù)類要實現(xiàn)的接口
? ? ? ? ? ? ? ? ,通過Proxy里的newProxyInstance得到代理對象
? ? ????還有一種動態(tài)代理,CGLIB代理的類,不需要業(yè)務(wù)類繼承接口,通過派生的子類實現(xiàn)代理,通過在運行時,動態(tài)修改,字節(jié)碼達(dá)到修改類的目的
AOP編程就是基于動態(tài)代理實現(xiàn)的,比如著名的Spring框架,Hibernate框架等等都是動態(tài)代理的使用例子
三、Java中的類加載器
? ? ? ? 1、Java中類加載器的種類有哪些
? ? ? ? ? ? ? ? ? ? 1.? ?根類的加載器(Bootstrap)----C++寫的,看不到源碼
? ? ? ? ? ? ? ? ? ? 2.擴展類加載器,(Extension)--加載位置:jre\lib\ext中
? ? ? ? ? ? ? ? ? ? 3.系統(tǒng)(應(yīng)用)類加載器(System\App) ---加載位置:classpath中
? ? ? ? ? ? ? ? ? ? 4.自定義加載器(必須繼承ClassLoader)
????????2、類什么時候初始化????????????
? ? ? ? ? ? ? ? 1)創(chuàng)建類的實例,也就是new一個對象
????????????????2)訪問某個類或接口的靜態(tài)變量,或者對該變量賦值
? ? ? ? ? ? ? ? 3)調(diào)用類的靜態(tài)方法
? ? ? ? ? ? ? ? 4)反射
? ? ? ? ? ? ????5)初始化一個類的子類(會首先初始化子類的父類)
? ? ? ? ? ? ????6)JVM啟動時標(biāo)明的啟動類,即文件名和類名相同的類
? ? ? ? ? ? ? ? ? ? ? ? ? ? 只有這六種情況,才會導(dǎo)致類的初始化
? ? ? ? 初始化化的步驟
? ? ? ? ? ? ? ? 1)如果這個類還沒有被加載和連接,那先進(jìn)性加載和連接
? ? ? ? ? ? ? ? 2)?加入這個類存在直接父類,并且這個類還沒有被初始化,(注意:一個類加載器中,類只能初始化一次)。那就初始化直接的父類(不使用于接口)
? ? ? ? ? ? 3).加入類中存在的初始化語句(如static變量和static塊),那就一次執(zhí)行初始化語句
? ? ? ? ? ?3.Java類加載體系之ClassLoadder雙親委派機制(這個在后面會有專門的文章進(jìn)行講解)
4、獲得一個對象有哪些方式?
類型.class? 例如:String.class
對象.getClass
Class.forName,