網(wǎng)站怎么才能吸引人seo優(yōu)化步驟
一、反射
1. 相關(guān)概念
(1) 類的對(duì)象:基于定義好的一個(gè)類,創(chuàng)建該類的實(shí)例,即利用 new 創(chuàng)建的實(shí)例就為類的對(duì)象。
(2) 類對(duì)象:類加載的產(chǎn)物,封裝了一個(gè)類的所有信息 ( 包名、類名、父類、接口、屬性、方法、構(gòu)造方法 ) 。
(3) 反射:通過反射可以獲取一個(gè)類的 類對(duì)象,從而獲取該類的信息,直接通過類對(duì)象進(jìn)行一系列操作。
2. 通過反射技術(shù)獲取類對(duì)象:
(1) 借助 Object 類中 getClass() 方法,通過 類的對(duì)象 獲取 類對(duì)象:
Student s = new Student (); // 類的對(duì)象
Class c1 = s.getClass(); // 類對(duì)象
(2) 通過 類名 .class 直接獲取類對(duì)象:
Class c2 = 類名 .class;
例如: Class c2 = Student.class;
(3) 通過 Class 類中靜態(tài)方法 forName(" 包名 . 類名 ") ;
Class c3 = Class.forName("test_flect.Student");
注意:參數(shù)需要 包名 . 類名 ,被稱為權(quán)限類名、全類名。
如果只給定了類名,則運(yùn)行報(bào)錯(cuò),錯(cuò)誤信息為:
java.lang.ClassNotFoundException( 類找不到異常 )
補(bǔ)充:類加載的時(shí)機(jī)。
(1) 第一次創(chuàng)建該類對(duì)象
(2) 第一次使用該類的靜態(tài)成員 ( 靜態(tài)屬性和靜態(tài)方法 )
(3) 子類類加載會(huì)導(dǎo)致其父類先進(jìn)行類加載。
(4) 通過反射獲取類對(duì)象,會(huì)導(dǎo)致類進(jìn)行類加載 3. 常用的方法:
(1) getName(): 獲取類名
(2) Method[] getMethods() :獲取本類 + 父類中所有公開方法
(3) Method[] getDeclaredMethods() :獲取自身所有方法,包含非公開的方法。
(4) 通過 類對(duì)象 創(chuàng)建 類的對(duì)象:
Class c = Class . forName ( "test_flect.Student" ); // 類對(duì)象
Object obj = c . newInstance (); // 類對(duì)象 獲取 類的對(duì)象
注意: Class 類中 newInstance() 方法,獲取類的對(duì)象,默認(rèn)調(diào)用無參數(shù)的構(gòu)造方法。
所以開發(fā)時(shí),對(duì)于封裝的實(shí)體類,建議提供無參數(shù)的構(gòu)造方法。
沒有提供對(duì)應(yīng)構(gòu)造方法,創(chuàng)建對(duì)象時(shí),報(bào)錯(cuò)信息為: java.lang.InstantiationException
(5) 通過有參數(shù)的構(gòu)造方法獲取類的對(duì)象:
// 獲取 類對(duì)象
Class c = Class . forName ( "test_flect.Student" );
// 獲取有參數(shù)的構(gòu)造方法
Constructor constructor = c . getConstructor ( String . class , Integer . class );
// 通過有參數(shù)的構(gòu)造方法獲取 類的對(duì)象
Object o = constructor . newInstance ( " 萬青 " , 48 );
System . out . println ( o );
(6) 調(diào)用某個(gè)方法:
Method m = c . getDeclaredMethod ( "test" );
m . setAccessible ( true );
m . invoke ( o );
4. 反射的優(yōu)缺點(diǎn):
(1) 缺點(diǎn):可讀性差,代碼繁瑣,打破封裝。
(2) 優(yōu)點(diǎn):可以使代碼更加通用和靈活。通常用于底層架構(gòu),例如:框架等。
二、設(shè)計(jì)模式 (23 種 )
1. 設(shè)計(jì)模式:一套被反復(fù)使用,多人知曉,并分門別類的編目的一套代碼經(jīng)驗(yàn)總結(jié)。
2. 適配器模式詳見接口課后題目。
3. 單例設(shè)計(jì)模式:常見的一種開發(fā)設(shè)計(jì)模式,在 Java 應(yīng)用程序中 , 必須保證 JVM 內(nèi)部?jī)H存在該類的一個(gè)實(shí)例對(duì)象。
(1) 第一種實(shí)現(xiàn)方式:餓漢式
// 第一種實(shí)現(xiàn)模式:餓漢式
class ClassA {
private static final ClassA ca = new ClassA ();
private ClassA (){}
// 提供
public static ClassA getInstance (){
return ca ;
}
}
優(yōu)點(diǎn):線程并發(fā)效率高
缺點(diǎn):空間利用率較低
(2) 第二種實(shí)現(xiàn)方式:懶漢式
// 第二種實(shí)現(xiàn)方式:懶漢式
class ClassB {
private static ClassB cb ;
private ClassB (){}
public synchronized static ClassB getInstance (){
if ( cb == null ){
cb = new ClassB ();
}
return cb ;
}
}
優(yōu)點(diǎn):空間利用率較高
缺點(diǎn):線程并發(fā)效率低
(3) 基于前兩種的優(yōu)缺點(diǎn),提供第三種方式:
// 第三實(shí)現(xiàn)方式:
class ClassC {
private ClassC (){}
private static class Inner {
final static ClassC c = new ClassC ();
}
public static ClassC getIntsance (){
return Inner . c ;
}
}
4. 工廠設(shè)計(jì)模式:
(1) 工廠設(shè)計(jì)模式:用于解決程序中對(duì)象創(chuàng)建的問題,一個(gè)工廠的作用在于完成對(duì)象的創(chuàng)建。
(2) 開發(fā)時(shí),通常借助反射的技術(shù)使工廠通用、靈活。
(3) 擴(kuò)充 Properties: 是 Hashtable 的子類,即 Map 的實(shí)現(xiàn)類
a. Properties: 鍵和值,默認(rèn)為 String 類型,創(chuàng)建該類對(duì)象時(shí),不要添加泛型。
b. load(InputStream in) / load(Reader in) :自動(dòng)將流指向文件內(nèi)容進(jìn)行加載,一行代表一個(gè)集合元素,
自動(dòng)以 "=" 、 ":" 進(jìn)行拆分,符號(hào) 左側(cè)作為鍵的內(nèi)容,右側(cè)作為值的內(nèi)容
c. String getProperty(String key) :通過鍵獲取對(duì)應(yīng)的值