1. 程式人生 > >類載入器|註解|動態代理

類載入器|註解|動態代理

一、類載入器

1.什麼是類載入器,作用是什麼?

類載入器就載入位元組碼檔案(.class)

 

2.類載入器的種類

  類載入器有三種,不同類載入器載入不同的

1)BootStrap:引導類載入器:載入都是最基礎的檔案

2)ExtClassLoader:擴充套件類載入器:載入都是基礎的檔案

3)AppClassLoader:應用類載入器:三方jar包和自己編寫java檔案

  怎麼獲得類載入器?(重點)

  ClassLoader 位元組碼物件.getClassLoader();

二、註解 @xxx

1.什麼是註解,註解作用

註解就是符合一定格式的語法

@xxxx

 註解作用:

註釋:在閱讀程式時清楚----給程式設計師看的

註解:給jvm看的,給機器看的

註解在目前而言最主流的應用:代替配置檔案

關於配置檔案與註解開發的優缺點:

註解優點:開發效率高 成本低  

註解缺點:耦合性大 並且不利於後期維護

2.jdk5提供的註解

@Override:告知編譯器此方法是覆蓋父類的

@Deprecated:標註過時

@SuppressWarnings:壓制警告

發現的問題:

  不同的註解只能在不同的位置使用(方法上、欄位上、類上)

3.自定義註解(瞭解)

1)怎樣去編寫一個自定義的註解

2)怎樣去使用註解

3)怎樣去解析註解-----使用反射知識

(1)編寫一個註解

  關鍵字:@interface

  註解的屬性:

  語法:返回值 名稱();

  注意:如果屬性的名字是value,並且註解的屬性值有一個 那麼在使用註解時可以省略value


註解屬性型別只能是以下幾種 

1.基本型別

2.String

3.列舉型別

4.註解型別

5.Class型別

6.以上型別的一維陣列型別

(2)使用註解

在類/方法/欄位 上面是@XXX


(3)解析使用了註解的類
 

  介入一個概念:元註解:代表修飾註解的註解,作用:限制定義的註解的特性

@Retention

SOURCE: 註解在原始碼級別可見

CLASS:註解在位元組碼檔案級別可見

RUNTIME:註解在整個執行階段都可見

@Target

代表註解修飾的範圍:類上使用,方法上使用,欄位上使用

FIELD:欄位上可用此註解

METHOD:方法上可以用此註解

TYPE:/介面上可以使用此註解

  

注意:要想解析使用了註解的類 那麼該註解的Retention必須設定成Runtime

關於註解解析的實質:從註解中解析出屬性值

位元組碼物件存在於獲得註解相關的方法

isAnnotationPresent(Class<? extends Annotation> annotationClass)  判斷該位元組碼物件身上是否使用該註解了

getAnnotation(Class<A> annotationClass) :獲得該位元組碼物件身上的註解物件

三、動態代理

1.什麼是代理(中介)

  目標物件/被代理物件 ------ 房主:真正的租房的方法

代理物件 ------- 黑中介:有租房子的方法(呼叫房主的租房的方法)

執行代理物件方法的物件 ---- 租房的人

流程:我們要租房----->中介(租房的方法)------>房主(租房的方法)

抽象:呼叫物件----->代理物件------>目標物件

2.動態代理

  動態代理:不用手動編寫一個代理物件,不需要一一編寫與目標物件相同的方法,這個過程,在執行時 的記憶體中動態生成代理物件。------位元組碼物件級別的代理物件

  動態代理的API:

    在jdk的API中存在一個Proxy中存在一個生成動態代理的的方法newProxyInstanc

static Object

newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 

 

  返回值:Object就是代理物件

  引數:loader:代表與目標物件相同的類載入器-------目標對.getClass().getClassLoader()

  interfaces:代表與目標物件實現的所有的介面位元組碼物件陣列

  h:具體的代理的操作,InvocationHandler介面

  注意:JDK的Proxy方式實現的動態代理 目標物件必須有介面 沒有介面不能實現jdk版動態代理