JAVA連載117-反射的應用與打破封裝新

来源:https://www.cnblogs.com/ruigege0000/archive/2020/05/23/12940653.html
-Advertisement-
Play Games

一、反射的概念 1.反射的概念是有Smith在1982年首次提出,主要是指程式可以訪問、檢測和修改它本身狀態或者行為的一種能力,並且根據自身行為的狀態和結果,調整或者修改應用所描述行為的狀態和相關的語義。 2.Java中,反射是一種強大的工具,它使您能夠創建靈活的代碼,這些代碼可以在運行時進行裝配, ...


一、反射的概念

1.反射的概念是有Smith在1982年首次提出,主要是指程式可以訪問、檢測和修改它本身狀態或者行為的一種能力,並且根據自身行為的狀態和結果,調整或者修改應用所描述行為的狀態和相關的語義。

2.Java中,反射是一種強大的工具,它使您能夠創建靈活的代碼,這些代碼可以在運行時進行裝配,無需在組件中進行源代碼的鏈接。

3.反射允許我們在編寫與執行的時候,使我們的代碼能夠裝載到JVM中的類的內部信息,而不是源代碼中選定的類協作的代碼,這使得放射成為構建靈活的應用的主要工具,但是需要主要註意的是,如果使用不當,會造成不可預知的結果。​

 

package com.bjpowernode.java_learning;

import java.util.Properties;

import java.io.*;

import java.util.*;

import java.io.FileReader;

//import com.bjpowernode.java_learning.classInfo.properties;
public class D116_2_ClassInfo {

  public static void main(String[] args) throws Exception{

    //1.創建屬性對象

    Properties p = new Properties();

    //2.創建流

    String address = "C:\\Users\\lenovo1\\Workspaces\\MyEclipse CI\\Java_learning\\src\\com\\bjpowernode\\java_learning\\classInfo.properties";

    FileReader fr = new FileReader(address);

    //3.載入

    p.load(fr);

    //4.關閉流

    fr.close();

    //通過key獲取value

    String className = p.getProperty("className");

    System.out.println(className);

    //通過反射機制創建對象

    Class c = Class.forName(className);

    //創建對象

    Object o = c.newInstance();

    System.out.println(o);

   

    //這種方式與我們直接new一個對象有什麼優勢

    //這種方式我們可以在外面設置properties屬性文件來達到修改創建對象的方式

  }

}

二、獲取某個指定的屬性,並且可以打破封裝性

 

package com.bjpowernode.java_learning;

import java.lang.reflect.*;

​

public class D117_2_Reflect {

  public static void main(String[] args) throws Exception{

    //獲取一個類

    Class c = Class.forName("com.bjpowernode.java_learning.D117_1_Reflect");

    //獲取id屬性

    Field idF = c.getDeclaredField("id");

//    System.out.println(idF);

   

    //獲取到某個特定的屬性?set,get

    Object o = c.newInstance();

   

    //因為id是private,所以需要打破封裝,下麵這個方法可以打破許可權

    idF.setAccessible(true);

    //使用反射機制可以打破java程式的封裝性,導致了Java對象的屬性變得不安全了

   

    //set方法,void idF.set(Object obj,Object value);

    idF.set(o, "004512");//給對象o的idF屬性賦上“004512”這個值

   

   

  }

}

 

三、源碼:

D117_1_Reflect.java

D117_2_Reflect.java

https://github.com/ruigege66/Java/blob/master/D117_1_Reflect.java

https://github.com/ruigege66/Java/blob/master/D117_2_Reflect.java

2.CSDN:https://blog.csdn.net/weixin_44630050

3.博客園:https://www.cnblogs.com/ruigege0000/

4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說句心裡話,小編在從事碼農之前。就是乾金融的!而且還是三年“萬金油” 多金多油 金融行業工資高? 我們當初在金融行業做業務,常常會說這樣一句安慰話:三月不出單,一單頂半年。 可想而知,這個薪水是真的讓人眼紅,高薪程式員瞬間就黯淡了。 但我為什麼又轉行做程式員? 一:金融行業就是從去年315開始下滑了 ...
  • 前提: SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(一):搭建基本環境:https://www.cnblogs.com/l-y-h/p/12930895.html 一、定義公共組件頁面 簡單的頁面效果如下所示:(做的比較粗糙,大致理解頁面即可) 1、 ...
  • 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 原文出處:https://blog.bitsrc.io/what-is-deno-and-will-it-replace-nodejs-a13aa1734a74 Deno是什麼? Deno v1.0.0已於5 ...
  • 一、JML初探 ​ 作為一種形式化語言,可以約束 代碼中類和方法的狀態和行為形成規格,通過將一系列具體代碼實現抽象成明確的行為介面,可以形成一種契約式編程模式, 設計者無需考慮實際的數據結構與演算法,可以聚焦於程式的整體邏輯, 形式化語言的無二義性能讓實現者準確理解介面功能,根據問題需要選擇合適的實現 ...
  • 首先安裝Erlang環境 因為 RabbitMQ 需要 erlang 環境的⽀持,所以必須先安裝 erlang 。 如果只是使用RabbitMQ,個人推薦使用RabbitMQ公司維護的 "erlang" 版本,該版本只保留了與RabbltMQ相關的功能, centOS6與7版本的都有,還有erlan ...
  • 【導讀】:前面的文章介紹了移動平均濾波器、IIR濾波器、梳狀濾波器,今天來談談FIR濾波器的設計實現。 本篇文章依然採用4W1H進行描述,從 What Why Where When How 幾個維度展開。為了便於理解4W1H,依然把5W1H的圖附上。 FIR濾波器之What? LTI線性時不變系統沖 ...
  • [導讀]:前面一篇文章關於IIR/移動平均濾波器設計的文章。本文來聊一聊陷波濾波器,該濾波器在混入諧波干擾時非常有用,演算法簡單,實現代價低。本文來一探其在機理、應用場景。 註:儘量在每篇文章寫寫摘要,方便閱讀。信息時代,大家時間都很寶貴,如此亦可節約粉絲們的寶貴時間。 前文所說學習的倡導2W1H原則 ...
  • 本文是學習筆記中的思維導圖,感覺思維導圖是個好東西,可以加深記憶、構建知識體系、還能為將來的複習提供便利。 完整筆記的地址在文末。說明下,併發編程的底層原理和JMM我打算背下來。 完整筆記地址: "java併發編程藝術學習筆記gitbook" "java併發編程藝術學習筆記github" 下麵這個是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...