23-java基础加强(反射、泛型、注解、动态代理)
一、反射
1. 一段java代碼在程序運行期間會經歷三個階段: source-->class-->runtime
??? Person.java—Person.class? à? 類加載到內存 Person.class –> 創建對象 程序運行
?
2. Class 對象
??? 在java中用一個Class對象來表示一個java類的class階段
??? Class對象封裝了一個java類中定義的成員變量、成員方法、構造方法、類名、包名等
?
3. 反射
??? 反射就是獲得一個java類的各個組成部分
??? 對第二個階段進行解析
?
4. 反射的用法
??? 1)需要獲得java類的各個組成部分,首先需要獲得代表java類的 Class 對象
??? 獲得Class對象的三種方式:
??? Class.forName(classname) 用于做類加載
??? obj.getClass()????????????? 用于獲得對象的類型
??? 類名.class?????????????? ??? 用于獲得指定的類型,傳參用
??? Person.class String.class int.class? int[].class void.class
?
??? 2) 反射類的成員方法
??? Class clazz = Person.class;
??? Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
??? method.invoke();
???
??? 3) 反射類的構造函數
??? Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
??? con.newInstance(params...)
?
??? 4) 反射類的屬性
??? Field field = clazz.getField(fieldName);
??? field.setAccessible(true);? // 由于屬性私有就不能直接訪問了,所以需要取消java的訪問權限檢查
??? field.setObject(value);
??? field.getObject();
?
5. 反射用在哪里
??? 到底框架是什么?? 框架就是將開發中大量重復的代碼集中起來寫個通用的程序
??? 框架就是用反射來實現的
??? 框架是一個通用的程序,這個程序是無法運行的,是缺少零部件的,零部件需要將來使用框架的人組裝進來
??? 框架需要現在的類調用將來寫的類
?
??? 框架是將來的程序員調用的,框架不能實現完整的功能,框架只是一些一些通用的代碼
??? 框架要運行一定會依賴將來寫的類
??? 現在寫的類要調用將來寫的類,我們先針對接口進行調用,將來的類需要實現接口,那么方法就固定了
??? 但是將來寫的類的類名我們無法獲知,這時就需要調用者通過配置文件告訴框架具體的類名
?
二、 泛型
1. 泛型是一種可變化的類型
??? 類型不確定,需要調用者來指定
???
2. 用途:
??? 一個類的多個成員方法用到的參數類型或返回值類型都是未知的類型,但又需要是同一個類型,就可將方法的
??? 參數類型定義為泛型,此泛型必須在類上先予以聲明才能在方法中使用
?
??? 一個方法的多個參數和返回值需要是同一個類型,也可以用泛型來解決,在返回值前面聲明泛型
?
3. 泛型的基本概念
以List<E>為例:<>念著typeof 例, List<String> 就是 List typeof String
List<E>中的E稱為類型參數變量???? 方法定義參數形式參數?
List<Integer>中的Integer稱為實際類型參數
整個List<E>稱為泛型類型?? GenericType
整個List<Integer>稱為參數化的類型
?
?
4. 泛型的使用
??? 1)使用帶泛型的類時,在創建對象時可以為泛型指定實際類型參數,指定的具體類型相當于給泛型傳參
??? 2)子類在繼承父類的時候,可以為父類定義的泛型指定實際類型參數
??? class B<T>
??? class A extends B<String>
??? 通過子類A獲得的父類類型就是一個參數化的類型
??? 3)調用方法時傳入參數的具體類型將作為方法中泛型的實際類型
?
三、注解
1. jdk中自帶的三個注解
??? @Deprecated 聲明方法已過時
??? @SuppressWarnings? 取消編譯器警告
??? @Override? 聲明方法是繼承自父類
?
2.? 什么是注解
??? 注解就是java代碼中的特殊標記,它用于告訴調用者類應該如何被運行
??? 注解相當于配置文件的功能
?
3. 自定義注解
使用 @interface 關鍵字可以聲明一個注解
public @interface MyAnnotation1
?
注解中可以定義屬性
String name default “aaa”;
?
value是注解中的特殊屬性
注解中定義的屬性如果名稱為 value, 此屬性在使用時可以省寫屬性名
?
4.元注解? 元Annotation
元注解簡單理解為 注解的注解
類似于描述一個注解的信息的配置文件
@Retention 指定注解的作用域
RetentionPolicy.SOURCE
RetentionPolicy.CLASS? default
RetentionPolicy.RUNTIME
?
@Target:指定注解用于修飾類的哪個成員.
@Target 包含了一個名為 value,類型為ElementType的成員變量。
?
@Inherited: 被它修飾的 Annotation 將具有繼承性.
如果某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具有該注解
?
5. 反射注解
??? 在程序可以通過反射來獲取注解中封裝的值
?
四、動態代理
我們可以為某一個對象生成一個代理對象
代理對象要和被代理的對象實現同樣的接口
代理對象的方法被調用時,我們可以做一些動作,再去調用真正被代理對象的方法
在代理對象中對用戶的權限進行檢查
?
所有的過濾器都可以用代理模式來解決
?
總結
以上是生活随笔為你收集整理的23-java基础加强(反射、泛型、注解、动态代理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 立秋什么时候吃西瓜?
- 下一篇: UML_时序图