動態代理,反射,注解的復習筆記

1.動態代理的作用

動態代理最主要的用途就是在各種框架中,很方便的在運行期間生成代理類,通過代理類就可以完成AOP、過濾器、攔截器等操作

(注:代理就是被代理者沒有能力或者不愿意去完成某件事情,需要找個人代替自己去完成這件事,動態代理就是用來對業務功能(方法)進行代理的。比如UserService類有1000個業務方法,每個業務方法都都需要記錄執行時間,那么不可能寫1000次相同代碼吧,因此可以讓代理對象幫忙完成時間記錄)
在這里插入圖片描述
首先使用動態代理必須基于接口,動態代理的靜態創建方法:

public static Object newProxyInstance(ClassLoader loader,/*對象.getClass().getClassLoader() ,目標對象通過getClass方法獲取類的所有信息后,調用getClassLoader()方法來獲取類加載器
獲取類加載器后,可以通過這個類型的加載器,在程序運行時,將生成的代理類加載到JVM即Java虛擬機中,以便運行時需要*/Class<?>[] interfaces,/*對象.getClass().getInterfaces() 
獲取被代理類的所有接口信息,以便于生成的代理類可以具有代理類接口中的所有方法*/InvocationHandler handle /*用于集中處理在動態代理類對象上的方法調用,通常在該方法中實現對委托類方法的處理以及訪問*/   ) 

java.lang.reflect.InvocationHandler是代理對象的實際處理代理邏輯的接口,具體代理邏輯在其 invoke 方法中實現

public Object invoke(Object proxy, Method method, Object[] args)
**解釋說明:
- 返回值:方法被代理后執行的結果
- 參數列表說明:Object proxy   :  就是代理對象(通常不使用)Method method  :  代理對象調用的方法Object[] args  :  被代理方法中的參數 (因為參數個數不定,所以用一個對象數組來表示)如果方法不使用參數,則為 null//所有代理對象調用的方法,執行是都會經過invoke
//因此如果要對某個方法進行代理增強,就可以在這個invoke方法中進行定義    

例子:

/*其中Star是代理類接口,具有Song和Dance方法;*/
public class ProxyUtil {public static Star createProxy(BigStar bigStar){Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class}, new InvocationHandler() {@Override // 回調方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理對象要做的事情,會在這里寫代碼if(method.getName().equals("sing")){System.out.println("準備話筒,收錢20萬");}else if(method.getName().equals("dance")){System.out.println("準備場地,收錢1000萬");}return method.invoke(bigStar, args);}});return starProxy;}
}

2.線程池的幾種狀態

  • RUNNING : 表示正常運行,既可以接受新任務,也會正常處理阻塞隊列的任務
  • SHUTDOWN : 當線程池調用shutdown()方法時,進入該狀態,表示線程池處于關閉狀態,不會接受新任務但是會處理隊列中的任務
  • STOP : 調用線程池的shutdownnow()方法時,進入該狀態,表示線程池處于停止狀態,既不接受新任務也不處理隊列任務,正常運行的線程也會被中斷
  • TIDYING : 線程池沒有線程運行時,狀態自動變為TIDYING,并且調用terminated(),該方法是空方法,留給程序與擴展
  • TERMINATED : terminated()方法執行完成后,線程池就變成該狀態

3.反射技術的作用,需要什么

  • 反射需要Class對象
  • 作用
    • 不使用new關鍵字去創建對象
    • 不使用“對象名.方法”的形式就可以調用方法
    • 不使用“對象名.屬性”的形式就可以給屬性賦值取值
    • 可以對私有成員變量進行操作

4.獲取Class對象的方法

  • 類型名.Class
  • 對象名.getcClass
  • Class.forName(String className) //className是全路徑類名 = 包名+類型名

5.反射創建對象的方法

  • 根據Class對象創建

    Class stuClass = Class.forName("com.cls.demo2.Student");Student stu = (Student) stuClass.newInstance();stu.study();
    
  • 獲取構造器進行創建

     //獲取Class對象(Student.class)
    Class stuClass = Student.class;//public Student(String name, int age, String gender)
    //獲取帶有參數的構造器對象
    //參數:是用來設置構造方法中參數的類型是什么
    Constructor con = stuClass.getConstructor(String.class, int.class, String.class);//實例化有參構造方法
    //參數:要傳遞給Student(String name, int age, String gender)的數據
    Student stu = (Student) con.newInstance("熊大", 22, "男");//調用對象中的方法
    stu.study();
    

6.獲取成員方法 方法調用

  • 獲取成員方法

    每一個成員方法都是一個Method類的對象,我們可以通過Method對象來調用成員方法

    Class類中的Method相關方法:

    Method[] getMethods();
    //獲得當前類和其父類中的所有public成員方法對象,返回數組Method[] getDeclaredMethods();
    //獲得當前類中的所有成員方法對象,返回數組
    //只獲得本類的,包括public、protected、默認、private的Method getMethod(String name,Class...args);
    //根據方法名和參數類型獲得對應的成員方法對象,只能獲得public的
    //參數說明:
    name : 類中方法的名字
    args : 方法中參數類型的Class     例:int.class     Method getDeclaredMethod(String name,Class...args);
    //根據方法名和參數類型獲得對應的成員方法對象,包括public、protected、(默認)、private的
    

    Method常用方法:

    //使用方法對象,調用對象中的方法執行(入棧執行)
    Object invoke(Object obj, Object... args) // 設置"暴力訪問"  ——是否取消權限檢查,true取消權限檢查,false表示不取消    
    void setAccessible(true)
    

    例子:

        @Testpublic void testMethod2() throws ClassNotFoundException {//獲取Class對象Class stuClass  = Class.forName("com.itheima.method.demo1.Student");//使用Class對象,獲取Method對象Method[] methods = stuClass.getDeclaredMethods();//獲取本類中所有方法(包含私有)for (Method m : methods){System.out.println(m);}}
    
  • 方法調用

反射調用對象的私有方法需要去除JVM權限檢查

7.注解

  • 自定義注解

    public @interface 注解名{//內容熟悉:數據類型 屬性名();數據類型 屬性名() dalfult 默認值;
    }
    
  • 元注解

    定義在自定義注解上,@Target指定自定義注解修飾什么地方,@Retention指定自定義注解生命周期(有效范圍)

    例子

    @Target({ElementType.METHOD,ElementType.TYPE}) //修飾類/接口 以及 方法
    public @inference stu{String name();
    }
    
  • 注解解析

    使用反射技術完成注解數據的解析

    步驟:

    • 利用反射獲取相關對象:類,構造器,方法,屬性
    • 利用方法getAnnotation,獲取自定義注解的對象
    • 通過注解的對象分別獲取注解屬性值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15227.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

02.爬蟲---HTTP基本原理

02.HTTP基本原理 1.URI 和 URL 的區別2.HTTP 和 HTTPS 的區別3.請求過程 1.URI 和 URL 的區別 URL&#xff08;Uniform Resource Locator&#xff09;即-統一資源定位符 URL是用來定位和訪問互聯網上資源的獨特標識&#xff0c;它包括了資源的位置&#xff08;如IP地址或域名&a…

移動硬盤難題:不顯示容量與無法訪問的解決策略

在使用移動硬盤的過程中&#xff0c;有時會遇到一些棘手的問題&#xff0c;比如移動硬盤不顯示容量且無法訪問。這種情況讓人十分頭疼&#xff0c;因為它不僅影響了數據的正常使用&#xff0c;還可能導致重要數據的丟失。接下來&#xff0c;我們就來詳細探討一下這個問題及其解…

CentOS 7安裝/卸載Grafana

說明&#xff1a;本文介紹CentOS 7操作系統如何安裝/卸載Grafana&#xff1b; 安裝 Step1&#xff1a;下載rpm文件 敲下面的命令&#xff0c;下載grafana的rpm文件 wget https://dl.grafana.com/oss/release/grafana-7.3.7-1.x86_64.rpmStep2&#xff1a;安裝grafana 敲下…

使用xxl-job-executor-go 接入xxl-job實現定時任務調度

定時任務是軟件開發中很常見的一種處理業務的機制&#xff0c;xxl-job是近些年比較火的定時任務調用組件&#xff0c;其采用java 實現&#xff0c;是一個高可用&#xff0c;分布式調用的組件&#xff0c;還支持多種定時任務有關的特性&#xff0c;不僅能輕易的用java 客戶端接入…

SpringBoot高級原理詳解

今日內容&#xff1a; 理解SpringBoot自動化配置源碼理解SpringBoot健康監控 1 SpringBoot自動化配置原理 01-SpringBoot2高級-starter依賴管理機制 目的&#xff1a;通過依賴能了解SpringBoot管理了哪些starter講解&#xff1a; 通過依賴 spring-boot-dependencies 搜索 …

【C++】<知識點> 標準模板庫STL(上)

文章目錄 一、STL---string類 1. 常用構造函數 2. 常用操作 3. 字符串流處理 二、STL---容器 1. STL及基本概念 2. 順序容器簡介 3. 關聯容器簡介 4. 容器適配器簡介 5. 常用成員函數 三、STL---迭代器 1. 普通迭代器 2. 雙向、隨機訪問迭代器 3. 不同容器的迭代器…

數據結構:二叉樹與樹

一 樹的基本概念&#xff1a; 1.樹的形狀&#xff1a; 2.樹的定義&#xff1a; 樹是一種非線性的數據結構&#xff0c;它是n(n > 0)個結點的有限集。當n 0時&#xff0c;稱為空樹。在任意一棵非空樹中應滿足&#xff1a; 2.1 有且僅有一個特定的稱為根的結點。 2.2 當n …

棧——順序存儲

#include<stdio.h> #define MaxSize 10 //棧的所有操作時間復雜度都是O(1) //定義 typedef struct{int data[MaxSize];int top; //棧頂指針&#xff0c;永遠指向棧頂元素 }SqStack;//初始化&#xff0c;使棧頂指針指向-1 void InitStack(SqStack &S){S.top-1; }…

k8s二進制安裝與部署

目錄 一、實驗目的 二、實驗環境 三、實驗步驟 3.1 操作系統初始化配置 3.2 部署 docker引擎 3.3 部署 etcd 集群 3.3.1 在 master01 節點上操作 ?3.3.2 在 node01 節點上操作 3.3.3 在 node02 節點上操作 3.4 部署 Master 組件 3.4.1 在 mast…

Softing工業推出新品edgeGate:一款用于工業邊緣和云應用的硬件網關

2024年4月17日&#xff08;哈爾&#xff09;&#xff0c;Softing工業自動化在2024年漢諾威工業博覽會上首次展示了新品edgeGate。該產品是一個無需維護的硬件物聯網網關解決方案&#xff0c;可將生產數據從PLC和數控機床控制器傳輸至工業邊緣及物聯網云平臺。 &#xff08;edge…

MiniMax Golang2輪面試,期望薪資25K

一面 1、自我介紹 2、簡單介紹一下你們成立了這個finance的財務中臺之后&#xff0c;整體的服務架構是怎么樣的嗎&#xff1f; 3、就你提到的預算池項目&#xff0c;展開說說背景&#xff0c;以及解決了怎么樣的問題&#xff1f; 4、為什么采用針對T-1訂單的異步計算方案&a…

jmeter線程組(下篇)

線程組 線程組作為JMeter測試計劃的核心組件之一&#xff0c;對于模擬并發用戶的行為至關重要。線程組元件是整個測試計劃的入口&#xff0c;所有的取樣器和控制器必須放置在線程組下。 可以將線程組視為一個虛擬用戶池&#xff0c;其中每個線程可被理解為一個虛擬用戶&#x…

(Java面試題分享)萬里長征-03-搜狐

萬里長征-03-搜狐 ? 以下內容基于GPT-4o模型 問題 1.LeetCode103 二叉樹的鋸齒形層序遍歷 103. 二叉樹的鋸齒形層序遍歷 - 力扣&#xff08;LeetCode&#xff09; 2.LeetCode5 最長回文子串 5. 最長回文子串 - 力扣&#xff08;LeetCode&#xff09; 3.Kafka為何那么快 …

java如何創建Class對象?

請思考一個問題&#xff1a;如果你想在java程序運行時獲得某個類的信息&#xff0c;你會怎么辦&#xff1f; 首先要獲得該類的Class對象&#xff0c;然后才可以通過Class類中的方法來獲得與該Class對象相對應的類的信息。 有3種方法來獲得類的Class對象&#xff1a; 1.用Cla…

【數據結構與算法 | 基礎篇】[棧專題]力扣20,150

1. 力扣20 : 有效的符號 (1). 題 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個…

初學者都能掌握的操作符(中)

&#xff08;1&#xff09;位操作符&#xff08;& | ^&#xff09; &&#xff1a;&#xff08;按二進制位“與”&#xff09; 也就是兩個數的每一位二進制數按照 “與” 的算法&#xff0c;如下&#xff1a; int a 3 ,b 5 ; c a & b; 我們首先寫出a和b的二進…

退格(刪除)鍵

題目描述 用 來表示退格鍵&#xff0c;遇到 來表示退格鍵&#xff0c;遇到 來表示退格鍵&#xff0c;遇到就刪除上一位字符&#xff08;如果有&#xff09; 在鍵盤上從左到右一次輸入一串字符串&#xff0c;請輸出最終字符的個數。注&#xff1a;退格鍵不會出現在最終的剩余字…

5.23.12 計算機視覺的 Inception 架構

1. 介紹 分類性能的提升往往會轉化為各種應用領域中顯著的質量提升&#xff0c;深度卷積架構的架構改進可用于提高大多數其他計算機視覺任務的性能&#xff0c;這些任務越來越依賴于高質量的學習視覺特征。在 AlexNet 功能無法與手工設計、制作的解決方案競爭的情況下&#xf…

如何評價劉強東說“業績不好的人不是我兄弟”

在近日的一次京東管理層會議上&#xff0c;創始人劉強東以不容置疑的口吻表明了對公司文化的堅定態度&#xff1a;“凡是長期業績不好&#xff0c;從來不拼搏的人&#xff0c;不是我的兄弟。”這句話不僅是對那些工作表現不佳的員工的直接警告&#xff0c;也透露出京東在追求業…

three.js能實現啥效果?看過來,這里都是它的菜(08)

在Three.js中實現旋轉動畫的原理是通過修改對象的旋轉屬性來實現的&#xff0c;通常使用渲染循環&#xff08;render loop&#xff09;來更新對象的旋轉狀態&#xff0c;從而實現動畫效果。 具體的原理包括以下幾個步驟&#xff1a; 創建對象&#xff1a;首先創建一個需要旋轉…