JAVA基礎學習筆記_反射+動態代理

文章目錄

  • 反射
    • 獲取class對象的三種方式
    • 獲取構造方法
    • 獲取成員變量
    • 獲取成員方法
    • 反射的作用
  • 動態代理

反射

允許對成員變量\成員方法\構造方法的信息進行編程訪問
把類內的信息扒的干干凈凈,獲取+解剖
獲取從class字節碼文件中獲取

獲取class對象的三種方式

public static void main(String[] args) throws ClassNotFoundException {//第一種//最為常用Class<?> aClass = Class.forName("com.itheima.stream.Student");System.out.println(aClass);//第二種//更多是作為參數進行傳遞Class<Student> studentClass = Student.class;System.out.println(studentClass);//第三種//有了這個類的對象,才可以使用Student student = new Student();Class<? extends Student> aClass1 = student.getClass();System.out.println(aClass1);
}

獲取構造方法

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getConstructors();//返回所有的公共構造方法
//        aClass.getDeclaredConstructors();//返回所有的構造方法
//        aClass.getConstructor();//返回單個公共的構造方法
//        aClass.getDeclaredConstructor();//返回單個的構造方法Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);//獲取構造中的參數Parameter[] parameters = declaredConstructor.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}//用反射創建對象//如果是私有的構造方法,需要設置 accessible 為 true,暴力反射訪問declaredConstructor.setAccessible(true);Student student = (Student) declaredConstructor.newInstance("張三", 23);System.out.println(student);
}

獲取成員變量

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getFields();
//        aClass.getDeclaredFields();
//        aClass.getField();
//        aClass.getDeclaredField();Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}Field name = aClass.getField("name");//獲取權限修飾符System.out.println(name.getModifiers());//獲取成員變量類型System.out.println(name.getType());
}

獲取成員方法

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getMethods();//獲取所有的方法(包含父類)
//        aClass.getDeclaredMethods();//獲取本類所有的方法(不包含父類)Method method = aClass.getMethod("toString");
//        aClass.getDeclaredMethod();//獲取拋出的異常Class<?>[] exceptionTypes = method.getExceptionTypes();for (Class<?> exceptionType : exceptionTypes) {System.out.println(exceptionType.getName());}Method eat = aClass.getMethod("eat", String.class);Student student = new Student();Object out = eat.invoke(student, "漢堡");System.out.println(out);
}

這里的invoke是重點,蒼穹外賣的代理有用到

反射的作用

  • 獲取一個類里面所有的信息,獲取到之后,再執行其他的業務邏輯
  • 結合配置文件,動態的創建對象并調用方法
    確實,我也想不出來怎么從配置文件中獲取或修改方法類
public static void saveObject(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class clazz = object.getClass();//獲取所有的成員變量Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);String name = declaredField.getName();Object o = declaredField.get(object);System.out.println(name + ":" + o);}
}

動態代理

無侵入式的給對象增強其他的功能
代理工具類

public class ProxyUtil {public static Star createProxy(BigStar bigStar){Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//指定用哪個類加載器,去加載生成的代理new Class[]{Star.class},//指定代理類需要實現的接口new InvocationHandler() {//指定生成的代理要干什么@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//參數1,代理對象//參數2,要調用的方法//參數3,調用方法時,傳遞的參數if ("sing".equals(method.getName())){System.out.println("準備話筒,收錢");} else if ("dance".equals(method.getName())) {System.out.println("準備場地,收錢");}return method.invoke(bigStar,args);}});return star;}

代理對象

public class BigStar implements Star{private String name;public BigStar() {}public BigStar(String name) {this.name = name;}@Overridepublic String sing(String name){System.out.println(this.name+"正在唱歌"+name);return "謝謝";}@Overridepublic void dance(){System.out.println(this.name+"正在跳舞");}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}

代理對象對應準備的接口,用接口代理對象實現附加功能

public interface Star {void dance();String sing(String name);
}

測試

public static void main(String[] args) {Star proxy = ProxyUtil.createProxy(new BigStar("王寶強"));String result = proxy.sing("某某");System.out.println(result);
}

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

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

相關文章

微信小程序一鍵復制功能

wx.setClipboardData(Object object) 設置系統剪貼板的內容。調用成功后&#xff0c;會彈出 toast 提示"內容已復制"&#xff0c;持續 1.5s wx.setClipboardData({data: 你需要復制的內容,success (res) {wx.getClipboardData({success (res) {console.log(res.dat…

【Python網絡爬蟲 常見問題匯總】

目錄 1. 爬取圖片出現403解決辦法&#xff1a;設置請求頭中的Referer字段 2.關于干壞事的問題后續不定期更新 歡迎共同探討學習進步 1. 爬取圖片出現403 問題出自案例9&#xff0c;已解決。 【Python網絡爬蟲筆記】9- 抓取優美圖庫高清壁紙 當在爬取圖庫圖片時遇到 403 錯誤…

Linux: docker: 怎么修改 proc下的文件內容?

文章目錄 參考問題方法 1:在宿主機上修改參數方法 2:啟動容器時掛載 /proc 為可寫方法 3:通過 Kubernetes 調整配置方法 4:構建特權容器參考 https://docs.docker.com/security/for-admins/hardened-desktop/enhanced-container-isolation/features-benefits/#procfs–sys…

分布式 分布式事務 總結

前言 相關系列 《分布式 & 目錄》《分布式 & 分布式事務 & 總結》《分布式 & 分布式事務 & 問題》 分布式事務 所謂分布式事務是指操作范圍籠罩多個不同節點的事務。例如對于訂單節點&庫存節點而言&#xff0c;一次完整的交易需要同時調動兩個節…

STM32+模擬或硬件IIC+SHT20驅動問題:接上拉電阻、BUSY死鎖?

主要問題&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模擬IIC&#xff0c;SCL和SDA口配置為推挽輸出上拉&#xff0c;主要是SDA腳&#xff0c;每次都要輸出輸入模式重新配置&#xff0c;雖然也能通信&#xff0c;但不穩定&#xff0c;出錯率大&#xff1b; 2&…

【工業機器視覺】基于深度學習的水表盤讀數識別(3-數據標注與轉換)

【工業機器視覺】基于深度學習的儀表盤識讀&#xff08;2&#xff09;-CSDN博客 數據標注 標注擴展 Labelme 和 LabelImg 都是用于創建機器學習和計算機視覺項目所需標注數據的工具。它們都允許用戶通過圖形界面手動標注圖像&#xff0c;但各自有其特點和適用場景。 Labelme…

靜態路由與交換機配置實驗

1.建立網絡拓撲 添加2臺計算機&#xff0c;標簽名為PC0、PC1&#xff1b;添加2臺二層交換機2960&#xff0c;標簽名為S0、S1&#xff1b;添加2臺路由器2811&#xff0c;標簽名為R0、R1&#xff1b;交換機劃分的VLAN及端口根據如下拓撲圖&#xff0c;使用直通線、DCE串口線連接…

【Spark】Spark Join類型及Join實現方式

Spark Join類型 1. Inner Join (內連接) 示例&#xff1a;val result df1.join(df2, df1("id") df2("id"), "inner")執行邏輯&#xff1a;只返回那些在兩個表中都有匹配的行。 2. Left Join (左外連接) 示例&#xff1a;val result df1.jo…

socket UDP 環路回顯的服務端

基于socket通訊的方式&#xff0c;無論用http或者udp或者自定義的協議&#xff0c;程序結構都是類似的。這個以UDP協議為例簡要說明。 #include <stdio.h> // 標準輸入輸出庫 #include <sys/types.h> // 提供了一些數據類型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的時候自動添加一個本地路由

文章目錄 問題問題 最近在看一個路由的問題,順便看內核代碼,發現在添加IP的時候,內核會自動添加一個local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力鏈媒體播放器

Magnet Player&#xff1a;一款基于Web的磁力鏈媒體播放器 項目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一個創新的開源項目&#xff0c;它允許用戶直接在瀏覽器中播放磁力鏈&#xff08;Magnet URI&#xff09;內容&#xff0c;無需下載或安裝任何桌面應用…

php:完整部署Grid++Report到php項目,并實現模板打印

一、下載Grid++Report軟件 路徑:開發者安裝包下載 - 銳浪報表工具 二、 安裝軟件 1、對下載的壓縮包運行內部的exe文件 2、選擇語言 3、 完成安裝引導 下一步即可 4、接收許可協議 點擊“我接受” 5、選擇安裝路徑 “瀏覽”選擇安裝路徑,點擊"安裝" 6、完成…

web安全攻防入門教程

Web安全攻防入門教程 Web安全攻防是指在Web應用程序的開發、部署和運行過程中&#xff0c;保護Web應用免受攻擊和惡意行為的技術與策略。這個領域不僅涉及防御措施的實現&#xff0c;還包括通過滲透測試、漏洞挖掘和模擬攻擊來識別潛在的安全問題。 本教程將帶你入門Web安全攻…

前端node環境安裝:nvm安裝詳細教程(安裝nvm、node、npm、cnpm、yarn及環境變量配置)

需求&#xff1a;在做前端開發的時候&#xff0c;有的時候 這個項目需要 node 14 那個項目需要 node 16&#xff0c;我們也不能卸載 安裝 。這豈不是很麻煩。這個時候 就需要 一個工具 來管理我們的 node 版本和 npm 版本。 下面就分享一個 nvm 工具 用來管理 node 版本。 這個…

Unity在運行狀態下,當物體Mesh網格發生變化時,如何讓MeshCollider碰撞體也隨之實時同步變化?

舊版源代碼地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 舊版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;當你動態地更改物體的Mesh時&#xff0c;通常期望…

OpenCV--特征匹配

OpenCV--特征匹配 代碼和筆記 代碼和筆記 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配&#xff1a;使用第一組&#xff08;第一幅圖&#xff09;中的一個特征描述子&#xff0c;使用一些距離計算與第二組中…

什么是自動化辦公

自動化辦公是指使用技術工具或軟件&#xff0c;通過預設流程或腳本&#xff0c;自動執行日常辦公任務&#xff0c;從而提升效率、減少錯誤、節約時間的辦公模式。它適用于需要重復性、規則明確的工作流程&#xff0c;讓員工將精力集中在更具創造性和戰略性的工作上。 自動化辦公…

常見排序算法總結 (四) - 快速排序與隨機選擇

快速排序 算法思想 每一輪在數組相應的范圍上隨機找一個元素進行劃分&#xff0c;將不大于它的所有元素都放到左邊&#xff0c;將大于它的元素都放到右邊。在左右兩個子數組上不斷地遞歸&#xff0c;直到整個數組上有序。 注意&#xff1a;實現時選擇的時參考荷蘭國旗問題優化…

unraid固態硬盤分區格式—默認1MiB對齊

背景 我的unraid中有三個機械硬盤和兩個固態硬盤&#xff0c;其中兩個固態硬盤組成zfs鏡像的cache&#xff0c;防止其中一個硬盤出問題導致數據丟失。然而&#xff0c;今天突然看到機械硬盤的分區格式為GPT 4k&#xff0c;而固態硬盤是MBR 1MiB。想到GPT更加優秀&#xff0c;并…

Flutter 圖片編輯板(一) 事件路由

一個圖片編輯板&#xff0c;有兩部分組成。編輯板和內容項。每一個內容項是被InteractiveViewer修飾的widget&#xff0c;具有縮放偏移的功能。 在圖片編輯板上&#xff0c; 會有多個內容相&#xff0c;圖片或文字&#xff08;添加文字目前還沒做過&#xff09;。 當要編輯其中…