JavaWeb 自定義註解和類載入器

2021-09-20 21:07:03 字數 3661 閱讀 1670

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

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

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

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

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

2.jdk5提供的註解

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

@deprecated:標註過時

@suppresswarnings:壓制警告

發現的問題:

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

3.自定義註解(了解)

(1)編寫乙個註解

關鍵字:@inte***ce

註解的屬性:

語法:返回值 名稱();

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

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

1.基本型別

2.string

3.列舉型別

4.註解型別

5.class型別

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

(2)使用註解

在類/方法/字段 上面是@***

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

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

@retention

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

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

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

@target

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

field:欄位上可用此註解

method:方法上可以用此註解

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

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

isannotationpresent(class extends annotation> annotationclass) : 判斷該位元組碼物件身上是否使用該註解了

getannotation(class annotationclass) :獲得該位元組碼物件身上的註解物件

demo

myannotest .class 自定義註解類

@myanno(name = "zhangsan")

public class myannotest )

public void show(string str)

}

myannoparser .class 解析

public class myannoparser 

}

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

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

classloader位元組碼物件.getclassloader();

demo

public class demo 

}

1.什麼是**(中介)

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

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

執行**物件方法的物件 ---- 租房的人

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

抽象:呼叫物件----->**物件------>目標物件

2.動態**

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

動態**的api:

在jdk的api中存在乙個proxy中存在乙個生成動態**的的方法newproxyinstance

static object newproxyinstance(classloader loader, class> inte***ces, invocationhandler h)

返回值:object就是**物件

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

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

h:具體的**的操作,invocationhandler介面

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

demo:

targetinte***ce .class **介面

public inte***ce targetinte***ce
target.class 介面實現類

public class target implements targetinte***ce

@override

public string method2()

@override

public int method3(int x)

}

proxytest .class 測試

public class proxytest , 

new invocationhandler() });

objproxy.method1();

string method2 = objproxy.method2();

system.out.println(method2);}}

輸出結果為:

目標方法前的邏輯

method1 running...

目標方法後的邏輯

目標方法前的邏輯

method2 running...

目標方法後的邏輯

method2

proxytest2 .class **測試

public class proxytest2 });

proxy.method1();//呼叫invoke---method:目標物件的method1方法 args:null 返回值null

string method2 = proxy.method2();//呼叫invoke---method:目標物件的method2方法 args:null 返回值method2

int method3 = proxy.method3(100);呼叫invoke-----method:目標物件的method3方法 args:object 返回值100

system.out.println(method2);

system.out.println(method3);}}

resutl:

method1 running...

method2 running...

method2

100

自定義註解

target elementtype.field retention retentionpolicy.runtime public inte ce setvalue以上就是乙個自定義的註解,下面來進行說明。target elementtype.field 表示支援該註解的程式元素,field就是屬性...

自定義註解

三個重要元註解 target 即註解的作用域,用於說明註解的使用範圍 即註解可以用在什麼地方,比如類的註解,方法註解,成員變數註解等等 elemenettype.constructor 構造器宣告 elemenettype.field 域宣告 包括 enum 例項 elemenettype.loca...

自定義註解

三個重要元註解 target 即註解的作用域,用於說明註解的使用範圍 即註解可以用在什麼地方,比如類的註解,方法註解,成員變數註解等等 elemenettype.constructor 構造器宣告 elemenettype.field 域宣告 包括 enum 例項 elemenettype.loca...