1、反射
反射就是把java類中的各種成分映射成相應的java類。例如:一個java類中用一個class類的對象來表示,一個類中的組成部分:成員變量、方法、構造方法、包等資訊也用一個個java類表示,就像汽車是一個類,汽車中的發動機,變速箱等也是一個個類。
class類 如何得到各個位元組碼對應的執行個體對象?
類名.class 如:System.class
對象.getClass() 如:Data().getClass()
class.forName(“類名”) 如:Class.forName("java.util.Date")
2、Constructor類
Constructor類代表某個類中的構造方法
Field類
Field類代表某個類中的一個成員變量
Method類
Method類代表某個類中的一個成員方法
如果傳遞給Method對象的invoke()方法的一個參數為null,說明該Method對象對應的是一個靜态方法
3、數組的反射
1、具有相同維數和元素類型的數組屬于一個類型,即具有相同的Class執行個體對象
2、代表數組的Class執行個體對象的getSuperChass()方法傳回的父類為Object類對應的Class
3、基本類型的一維數組可以被當做Object類型使用,不能當做Object類型使用,非基本類型的一維數組,既可以Object類型使用,又可以當做Object類型使用
反射的作用:實作架構的功能
4、記憶體洩露
記憶體洩露就是一個對象不用了,但一直占用記憶體空間,沒有被釋放。
5、内省(IntroSpector)
1、JavaBean是一種特殊的java類,主要用于傳遞資料資訊,這種java類中的方法主要用于通路私有的字段,且方法名符合某種命名規則。
2、如果在兩個子產品中傳遞多個資訊,可以将這些資訊封裝到一個JavaBean中,這種JavaBean的執行個體對象通常稱之為值(Value Object)簡稱VO.這些資訊在類中用私有的字段類存儲,如果讀取或設定這些字段的值,則需要通過一些相應的方法通路。
javaBean的屬性是根據其中的setter和getter方法來确定的,而不是根據其中的成員變量。
JDK中提供了對JavaBean進行操作的API,這套API就稱為内省。如果要通過關getXxx方法類通路私有的X,用内省這套API操作JavaBean比普通類方式更友善。
getXxx() 不接受參數
setXxx(type Ooo) 要接受參數
class Person{
private int x;
public int getAge(){
return x;
}
public void setAge(int age){
this.x = age;
}
}
6、元注解
J2SE5.0 為注解單獨提供了4種注解,即元注解,屬于java.lang.annotation 包中。它們是@Target、@Retention、@Documented和@Inheried
1、@Targe
作為元注解類型的@Target,它描述了注解所适用的程式元素的種類。當一個注解類型沒有@Target時,則表明該注解可适用于所有程式元素上。當存在@Target時,編譯程式将強制實施指定的使用限制。
@Target所指的目标就是java的語言元素如類接口方法等。當然,@Target還可以對其他元素進行限制,如構造方法字段參數等。@Target中元素的值不能重複出現,負責編譯出錯。
2、@Retention
既然可以自定義注解,當然也就可以讀取程式中的注解。annontation的@Retention定義了該annotation被保留的時間長短:某些annotation僅出現在源代碼中,但被編譯器丢棄l
3、@Documented
@Documented這個注解和它的名字一樣于文檔有關。在預設的情況下使用javaadoc或其他的類似工具自動生成文檔時,注解被忽略掉。如果想在文檔中也包含注解,必須使用@Documented為文檔注解。
4、@Inherited
@Inheried也是一個标記型标記,表示注解類型會被自動繼承。如果一個使用了@Inherited修飾的注解類型被用于一個class,則這個注解将被用于該class的子類。
7、泛型(JDK1.5的新特性)
泛型是提供給java編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程式中的非法輸入,編譯器編譯時帶類型說明的集合時會去掉“類型”資訊,使程式運作效率不受影響。
泛型的最大特點:類中的屬性的類型可以由外部決定,聲明類的時候:
class 類名稱<泛型類型,泛型類型......>{..........}
一個泛型類就是具有一個或多個類型變量的類,即泛型類可以帶有兩個及以上類型參數,參數之間用逗号分隔。
泛型方法:
定義泛型方法,隻需将泛型參數清單置于傳回值之前。類型變量放在修飾符的後面,傳回類型的前面。在前面的示例中,當使用泛型類時,必須在建立對象的時候指定類型參數的值,而使用泛型方法的時候,通常不必指明參數類型,因為編譯器會根據參數值判斷出具體的類型。 必須通過對象的引用,才能調用泛型方法。如this.<Double>f(3.14),不能簡化成.<Double>f(3.14)
可變參數是1.5的新特性,可變參數可用于泛型方法表示聲明一個就受可變數目參數的泛型方法,可變參數必須是方法聲明中的最後一個參數。
8、泛型通配符
參數化類型必須是List類型或其子類型,要滿足這種要求,可以使用”?“通配符,并使用”extends“關鍵字限定參數類型。例如:
Generics<? extends List>gen = null;
gen = new Generics<ArrayList>();
gen = new Generics<LinkedList>();
如果指定不是List的類型或者子類型,則編譯會報告錯誤。如:
Generics <? extends List>gen = new Generics <HashMap>();
如果隻指定了<?>而不使用”extends “關鍵字,則可以是Object類及其子類,也就是所有的類了
java并不能建立泛型數組,需要建立數組的地方使用ArrayList .如:
public class Generics<T>{
private List<T> arr = new ArrayList<T>();
public void add(T item){
arr.add(item);
}
public T get(int index){
return arr.get(index);
}
}
9、類加載器
加載類的工具
1、JVM中可以安裝多個類加載器,系統預設三個主要類加載器,每個類負責加載特定位置的類。
BootStrap ExtclassLoader AppClaaLoader
2、;類加載器也是java類
3、JVM中所有的類加載器采用具有父子關系的樹形結構進行組織,在執行個體化每個類加載器對象是,需要為其指定一個父級類裝載器對象或者預設采用系統類裝載器為其父級類加載。
10、代理
JVM可以在運作期間動态生成出類的位元組碼,這種動态生成的類往往被用作代理類,即動态代理類。
JVM生成的動态類必須實作一個或多個接口,是以,JVM生成的動态類隻能用作具有相同接口目标類的代理。
CGLIB庫可以動态的生成一個類的子類,一個類的子類也可以用作類的代理,是以,如果為一個沒有實作接口的類生成動态代理類,那麼可以使用CGLIB庫。
代理類的各個方法中通常除了要調用目标的相應方法和對外傳回目标傳回的結果外,還可以代理方法和對外傳回目标。可以在代理類中的如下四個位置加上系統功能代碼:
1、在調用目标方法之前
2、在調用目标方法之後
3、在調用目标方法前後
4、在處理目标方法異常的catch塊中