註釋 類加載器 動態代理
類加載器
* 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:調用方法傳入的實際參數
註釋 類加載器 動態代理