【反射1】——Java基礎(韓順平講解)

一個需求,引出反射 | 完整的反射使用流程:

在不修改源碼的情況下,來控制程序,也符合設計模式中的opc原則(開閉原則:不修改源碼,擴容功能)

1、創建配置文件:re.properties

classfullpath=com.reflection.Cat
method=hi

2、創建Cat類

package com.reflection;public class Cat {public String name = "招財貓";public void hi(){System.out.println("hi!"+ name);}public void cry(){System.out.println(name + "喵喵叫!");}
}

3、創建調用類:quection,并回顧傳統調用的方法,以及反射機制解決的完整流程

package com.reflection;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class quection {public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//問題:根據配置文件 re.properties 中的指定信息,創建Cat類 并 調用hi方法;//傳統方法Cat cat = new Cat();cat.hi(); // 如果想調用cry方法,只能修改代碼;System.out.println("===========================================");//反射//1. 使用Properties類 獲取配置文件中的內容Properties properties = new Properties();properties.load(new FileInputStream("src\\main\\resources\\re.properties"));String classfullpath = properties.getProperty("classfullpath").toString();String method = properties.getProperty("method").toString();System.out.println("classfullpath:" + classfullpath);System.out.println("method:" + method);//2. 使用反射機制解決Class aClass = Class.forName(classfullpath); //加載類,返回Class類型的對象aClassObject o = aClass.newInstance(); //通過aClass得到 com.reflection.Cat 類的對象實例System.out.println("o的運行類型:" + o.getClass());//通過 aClass 得到 com.reflection.Cat 類的 methodName為“hi”的方法對象//即:在反射中,可把方法視為對象(萬物接對象)Method method1 = aClass.getMethod(method);System.out.println("===========================================");//通過 方法對象 來實現 調用方法; 也就是 通過 method1對象 來調用 Cat類中的方法;method1.invoke(o);//傳統方法:對象.方法();  反射:方法.invoke(對象);}
}

在 傳統方法調用 和 反射機制 中,若改為調用Cat類中的cry方法:
傳統方法需要修改代碼,而反射機制只需要修改配置文件即可,將re.properties配置文件中的,method=hi 改為 method=cry

反射機制:

反射機制允許程序在執行期借助于ReflectionAPI取得任何類的內部信息(比如成員變量,構造器,成員方法等),并能操作對象的屬性及方法。反射在設計模式和框架底層都會用到。

加載完類后,在堆中就產生了一個Class類型的對象(一個類只有一個Class對象),這個對象包含了類的完整結構信息。通過這個對象得到類的結構。這個Class對象就像一面鏡子,透過這個鏡子看到類的結構,所以,形象的稱之為:反射。

Java反射機制原理示意圖:
在這里插入圖片描述

Java反射機制可以完成:

1、在運行時判斷任意一個對象所屬的類
2、在運行時構造任意一個類的對象
3、在運行時得到任意一個類所具有的成員變量和方法
4、在運行時調用任意一個對象的成員變量和方法
5、生成動態代理

反射相關的主要類:這些類在java.lang.reflection包中

1、java.lang.Class:代表一個類,Class對象表示某個類加載后在堆中的對象
2、java.lang.reflect.Method:代表類的方法,Method對象表示某個類的方法
3、java.lang.reflect.Field:代表類的成員變量,Field對象表示某個類的成員變量
4、java.lang.reflect.Constructor:代表類的構造方法,Constructor對象表示構造器

反射相關的主要類的代碼應用:

package com.reflection;public class Cat {private String name = "招財貓";public int age = 0;public Cat() {}public Cat(String name) {this.name = name;}public void hi(){System.out.println("hi!"+ name);}public void cry(){System.out.println(name + "喵喵叫!");}
}
package com.reflection;import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;public class reflection01 {public static void main(String[] args) throws Exception {//反射//1. 使用Properties類 獲取配置文件中的內容Properties properties = new Properties();properties.load(new FileInputStream("src\\main\\resources\\re.properties"));String classfullpath = properties.getProperty("classfullpath").toString();String method = properties.getProperty("method").toString();//2. 使用反射機制解決Class aClass = Class.forName(classfullpath); //加載類,返回Class類型的對象aClassObject o = aClass.newInstance(); //通過aClass得到 com.reflection.Cat 類的對象實例System.out.println("o的運行類型:" + o.getClass());//通過 aClass 得到 com.reflection.Cat 類的 methodName為“hi”的方法對象//即:在反射中,可把方法視為對象(萬物接對象)Method method1 = aClass.getMethod(method);System.out.println("===========================================");//通過 方法對象 來實現 調用方法; 也就是 通過 method1對象 來調用 Cat類中的方法;method1.invoke(o);//傳統方法:對象.方法();  反射:方法.invoke(對象);//java.lang.reflect.Field:代表類的成員變量,Field對象表示某個類的成員變量//得到name字段;//getField不能得到私有的屬性Field name = aClass.getField("age");System.out.println(name.get(o));//傳統寫法:對象.成員變量   反射:成員變量對象.get(對象)//java.lang.reflect.Constructor:代表類的構造方法,Constructor對象表示構造器Constructor constructor = aClass.getConstructor();//()中可以指定構造器參數類型,返回無參構造器System.out.println(constructor);//Cat()Constructor constructor1 = aClass.getConstructor(String.class);//這里傳入的String.class 就是String類的Class對象System.out.println(constructor1);//Cat(String name)}
}

反射的優點和缺點:

優點: 可以動態的創建和使用對象(也是框架底層核心),使用靈活,沒有反射機制,框架技術就失去底層支撐。
缺點: 使用反射基本是解釋執行,對執行速度有影響。

package com.reflection;import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;public class reflection02 {public static void main(String[] args) throws Exception {m1();m2();m3();}//傳統方法調用hipublic static void m1() {Cat cat = new Cat();long start = System.currentTimeMillis();for (int i = 0; i < 900000000; i++) {cat.hi();}long end = System.currentTimeMillis();System.out.println("m1() 耗時:" + (end - start));}//反射機制調用方法hipublic static void m2() throws Exception {Class aClass = Class.forName("com.reflection.Cat"); //加載類,返回Class類型的對象aClassObject o = aClass.newInstance(); //通過aClass得到 com.reflection.Cat 類的對象實例Method method1 = aClass.getMethod("hi");//通過 aClass 得到 com.reflection.Cat 類的 methodName為“hi”的方法對象long start = System.currentTimeMillis();for (int i = 0; i < 900000000; i++) {method1.invoke(o);//反射調用方法}long end = System.currentTimeMillis();System.out.println("m2() 耗時:" + (end - start));}//反射機制優化調用方法hipublic static void m3() throws Exception {Class aClass = Class.forName("com.reflection.Cat"); //加載類,返回Class類型的對象aClassObject o = aClass.newInstance(); //通過aClass得到 com.reflection.Cat 類的對象實例Method method1 = aClass.getMethod("hi");//通過 aClass 得到 com.reflection.Cat 類的 methodName為“hi”的方法對象method1.setAccessible(true);long start = System.currentTimeMillis();for (int i = 0; i < 900000000; i++) {method1.invoke(o);//反射調用方法}long end = System.currentTimeMillis();System.out.println("m3() 耗時:" + (end - start));}
}=========執行結果============
m1() 耗時:4
m2() 耗時:1187
m3() 耗時:775

反射的簡單優化——關閉訪問檢查:

1、Method 和 Field、Constructor對象都有setAccessible()方法
2、setAccessible作用是啟動和禁用訪問安全檢查的開關
3、參數值為true表示,反射的對象在使用時取消訪問檢查,提高反射的效率。參數值為false,則表示反射的對象執行訪問檢查。
在這里插入圖片描述

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

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

相關文章

SATA和M.2接口的異同點

SATA和M.2接口是連接存儲設備的兩種常見接口&#xff0c;它們在物理尺寸、傳輸速度、線纜和接頭以及適用設備類型等方面有著顯著的異同點。 物理尺寸 SATA接口通常用于2.5英寸硬盤、3.5英寸硬盤等傳統機械硬盤以及SSD&#xff0c;而M.2接口則是一種較為新型的接口標準&#xff…

裝飾 Web3 項目的用戶交互界面(Web3項目二實戰之四)

用戶交互界面是Web3項目必不可少的,畢竟,Web3項目最終是面向用戶的,所以,Web3項目總得需要一個優美的UI界面,已達到用戶在視覺上精彩盛宴。 誠然,一個Web3項目若到了用戶交互界面,大體上,這個Web3項目也將告一段落了。 沒錯,Web3第二個項目,也將終結于本篇,順勢拉開…

線下終端門店調研包含哪些內容

品牌渠道一般分為線上和線下&#xff0c;線上的價格、促銷信息、店鋪優惠機制等都可以通過登錄查看&#xff0c;但是線下門店的數據則需要進店巡查&#xff0c;否則無法得到真實的店鋪銷售數據&#xff0c;當然也有品牌是靠線下的業務團隊報備機制獲得這些信息&#xff0c;但是…

前端常用的Vscode插件

前端常用的Vscode插件&#x1f516; 文章目錄 前端常用的Vscode插件&#x1f516;1. Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code -- Vscode中文插件2. Code Runner -- 快速運?調試代碼3. Live Server -- 實時重新加載本地開發服務器4. Image prev…

uni-app之HelloWorld實現

鋒哥原創的uni-app視頻教程&#xff1a; 2023版uniapp從入門到上天視頻教程(Java后端無廢話版)&#xff0c;火爆更新中..._嗶哩嗶哩_bilibili2023版uniapp從入門到上天視頻教程(Java后端無廢話版)&#xff0c;火爆更新中...共計23條視頻&#xff0c;包括&#xff1a;第1講 uni…

JAVA版的鴻鵠云商B2B2C:多商家入駐直播商城系統特性解析 商城免 費搭建

鴻鵠云商 b2b2c產品概述 【b2b2c平臺】&#xff0c;以傳統電商行業為基石&#xff0c;鴻鵠云商支持“商家入駐平臺自營”多運營模式&#xff0c;積極打造“全新市場&#xff0c;全新 模式”企業級b2b2c電商平臺&#xff0c;致力干助力各行/互聯網創業騰飛并獲取更多的收益。從消…

Swift 檢測 iCloud狀態

Show me the code: func isICloudContainerAvailable() -> Bool {if let _ FileManager.default.ubiquityIdentityToken {return true} else {return false} }推薦一下剛上線的 App 熊貓小賬本&#xff0c;里面有用到這篇博客講的內容 熊貓小賬本 一個簡潔的記賬 App&…

006.HCIA 路由

1、設備管理 用戶視圖 <xxxx> 系統視圖 [xxxx] 接口視圖 [xxxx-G] 協議視圖 a. 視圖切換 用戶視圖 -> 系統視圖 系統視圖 -> 接口視圖 當前視圖 -> 上一層視圖 當前視圖 -> 用戶視圖 system-view interface g0/0/0 quit Ctrl Z b. 系統視圖命令…

人工智能:預測房價模型的構建與應用

摘要&#xff1a; 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一種模擬人類智能思維的技術。“預測房價”是AI在房地產領域的重要應用之一。本文將介紹如何使用Python構建一個預測房價的人工智能模型&#xff0c;并對其進行說明和應用。 引言 人…

JavaOOP篇----第十六篇

系列文章目錄 文章目錄 系列文章目錄前言一、a=a+b與a+=b有什么區別嗎?二、final、finalize()、finally三、JDBC操作的步驟四、在使用jdbc的時候,如何防止出現sql注入的問題。前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊…

tinymce自定義工具欄

tinymce自定義工具欄 話不多說直接上代碼&#xff0c;此處添加 imgs 的工具為例 initTinymce() {const _this thisreturn {language_url: https://cdn.jsdelivr.net/npm/tinymce-i18n20.12.25/langs5/zh_CN.js,language: zh_CN,body_class: panel-body ,object_resizing: fal…

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一個美好的下我接觸到編程并且逐漸喜歡。我雖然不是科班出身但是我會更加努力地去學&#xff0c;有啥不對的地方請斧正 文章目錄 目錄 文章目錄 前言 想必大家對sizeof肯定很了解&#xff0c;那對strlen又了解多少。其實這個問題應該讓不少人困擾。…

openmediavault基本操作

omv基本操作 使用hostname訪問共享文件夾設置1.掛載磁盤2.提交更改3.新建用戶4.建立共享文件夾5.設置SMB/CIFS服務7.測試7.1.速度測試 使用hostname訪問 把網口和wifi設置成DHCP,使用hostname訪問,這樣把NAS拿到任何地方都不需要配置了,自動聯網進行訪問. #網絡->常規 #設…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪聲信道中的誤碼率與歸一化信噪比的關系

本文為學習所用&#xff0c;嚴禁轉載。 本文參考鏈接 https://zhuanlan.zhihu.com/p/667382398 QPSK代碼及高斯白噪聲如何產生 https://ww2.mathworks.cn/help/signal/ref/butter.html 濾波器 https://www.python100.com/html/4LEF79KQK398.html 低通濾波器 本實驗使用matlab仿…

靜態HTTP的優勢:速度、安全性和可擴展性,一個都不能少!

大家好&#xff0c;今天我們來聊聊靜態HTTP的優勢。有人可能會說&#xff1a;“靜態HTTP&#xff0c;不就是那些不會動的網頁嗎&#xff1f;”錯&#xff01;靜態HTTP可不僅僅是靜止不動的&#xff0c;它可是讓網站速度飛快、安全穩定、擴展性強的神器&#xff01;不信&#xf…

鴻蒙插槽?全局插槽和局部插槽?數據不更新?

Builder的基本語法數據是不會響應式的 第一種&#xff1a; 全局插槽&#xff1a;傳入的變量是state數據&#xff08;數據是對象也一樣&#xff09;&#xff0c;但是button點擊更改&#xff0c;并沒有任何反應。規則就是不更新 Entry Component struct Demo02 {State message:…

TomcatHttp協議

1 javaWEB 1.1 Web概述 Web在英文中的含義是網狀物&#xff0c;網絡。在計算機領域&#xff0c;它通常指的是后者&#xff0c;即網絡。像我們前面接觸的WWW&#xff0c;它是由3個單詞組成的&#xff0c;即&#xff1a;World Wide Web&#xff0c;中文含義是萬維網。而我們前…

如何深入理解Java的多態?

在Java中&#xff0c;多態&#xff08;polymorphism&#xff09;是面向對象編程的一個重要概念&#xff0c;它允許你使用一個通用的接口來表示不同的對象和操作這些對象&#xff0c;而不必關心具體的對象類型。多態性有兩種主要形式&#xff1a;編譯時多態&#xff08;靜態多態…

C語言使用qsort和bsearch實現二分查找

引言 在計算機科學領域&#xff0c;查找是一項基本操作&#xff0c;而二分查找是一種高效的查找算法。本博客將詳細解釋一個簡單的C語言程序&#xff0c;演示如何使用標準庫函數qsort和bsearch來對一個整數數組進行排序和二分查找。 代碼解析 包含頭文件 #include <stdi…

數據分析思維

Why&What 數據分析是為了驅動決策賦能業務。在數據分析過程中需要對目標進行拆解量化&#xff0c;如何拆解量化目標便是數據分析思維。 在任務拆解過程中使用的軟件、統計模型、分析方法等為分析工具和手段&#xff0c;如何在恰當的場景合理的使用這些工具、模型、方法、手…