1. 程式人生 > >註釋 類加載器 動態代理

註釋 類加載器 動態代理

source 是否 print out ava 分隔 user pre 修飾符

類加載器

* bootstrap 根類加載器 核心包下的類 不是類

* ext 擴展類加載器 擴展包下的類

* app 應用加載器 自定義的類 第三提供的類

*

* Class

* ClassLoader getClassLoader()獲取類加載器

* ClassLoader

* ClassLoader getParent() 獲取父加載器>

註解:

java.lang.reflect.AnnotatedElement 接口

* 方法

* boolean isAnnotationPresent(要判斷的那個註解的字節碼文件 MyAnnotaion4.class)

* 判斷對象上是否有註解 如果要獲取MyAnnotaion4這個註解 參數就傳入MyAnnotation4.class

* 返回值是boolean 有則為true 沒有則為false

* MyAnnotation4 getAnnotation(要獲取的那個註解的字節碼文件 MyAnnotation4.class) 獲取註解

自定義註解 :

* 格式

* 修飾符 @interface 註解名{

*

* }

註解的屬性定義

* 固定格式

* 修飾符 返回值類型 屬性名() [default 屬性值]

* 修飾符:public abstract

* 返回值類型:基本類型 字符串 Class 枚舉 其他註解 以上有所有類型的一維數組

* 屬性名:自定義

特殊的屬性名 value

* 當且僅當 註解中只有一個屬性 並且這個屬性叫value時 value在賦值時可以省略不寫

元註解

* @Retention 用於確定被修飾的自定義註解生命周期

* 源碼中 source

* 源碼中 編譯後的class中 class

* 源碼中 編譯的class中 運行的class中 runtime

* @Target 用於確定被修飾的自定義註解使用位置

* type 類

* method 方法

* Constructor 構造方法

* field 字段

註解的使用

* 註解可以沒有屬性,如果有屬性需要使用小括號括住。例如:@MyAnno1或@MyAnno1()

* 屬性格式:屬性名=屬性值,多個屬性使用逗號分隔。例如:@MyAnno2(username="rose")

* 如果屬性名為value,且當前只有一個屬性,value可以省略。

* 如果使用多個屬性時,k的名稱為value不能省略

* 如果屬性類型為數組,設置內容格式為:{ 1,2,3 }。例如:arrs = {"it","it"}

* 如果屬性類型為數組,值只有一個{} 可以省略的。例如:arrs = "itcast"

* 一個對象上,註解只能使用一次,不能重復使用。

* 如果屬性沒有默認值 則必須為屬性賦值 如果屬性有默認值則可以不賦值

<--案例:

public class Demo01_GetAnnotation {

@MyAnnotation04(age = 18, name = "liuyan")

public void method() {

}

@Test

public void getAnno() {

// 獲取Demo01_GetAnnotation的字節碼文件對象

Class c = Demo01_GetAnnotation.class;

// 獲取字節碼文件對象的所有方法

Method[] methods = c.getMethods();

// 遍歷 判斷哪個方法上有@MyAnnotation04這個註解

for (Method m : methods) {

// 判斷方法上是否有註解

boolean b = m.isAnnotationPresent(MyAnnotation04.class);

// System.out.println(b+".."+m.getName());

//// 如果有 則獲取這個註解

if (b) {

MyAnnotation04 my4 = m.getAnnotation(MyAnnotation04.class);

// 根據註解獲取屬性值

int age = my4.age();

System.out.println(age);

String name = my4.name();

System.out.println(name);

}

}

}

}

---->

<動態代理>

java.lang.reflect.Proxy

* static Object newProxyInstance(

* ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 生成代理對象

* 返回值

* Object:返回的就是代理對象 Actor

* 參數

* ClassLoader loader:類加載器 Actor類的類加載器 Actor.class.getClassLoader

* Class[] interfaces:Person類實現的所有接口 a.getClass.getInterfaces

* InvocationHandler h:接口 方法的參數是一個接口 需要給其實現類對象 匿名內部類 new InvocationHandler(){ 重寫方法}

*

* InvocationHandler的方法

* Object invoke(Object proxy, Method method, Object[] args)

* 返回值

* Object: 調用方法產生返回值 用Object類型接口 sing run

* 參數

* Object proxy:代理對象 與你無關

* Method method:你調用了哪個方法 這個method就是哪個方法

* Object[] args:調用方法傳入的實際參數

註釋 類加載器 動態代理