java基礎反射Reflection簡單介紹

2020-12-04 一名普通的開發者

反射(Reflection)

反射(Reflection)是 Java 程序開發語言的特徵之一,它允許運行中的 Java 程序獲取自身的信息,可以在運行時訪問 Java 對象的屬性,方法,構造方法等。

應用場景

開發通用框架 - 反射最重要的用途就是開發各種通用框架。比如 Spring通過 XML 文件配置 JavaBean、Filter 等,為了保證框架的通用性,它們可能需要根據配置文件加載不同的對象或類,調用不同的方法,這個時候就必須用到反射——運行時動態加載需要加載的對象。動態代理 - 在切面編程(AOP)中,需要攔截特定的方法,通常,會選擇動態代理方式。註解 - 註解本身僅僅是起到標記作用,它需要利用反射機制,根據註解標記去調用註解解釋器,執行行為。如果沒有反射機制,註解並不比注釋更有用。可擴展性功能 - 應用程式可以通過使用完全限定名稱創建可擴展性對象實例來使用外部的用戶定義類。缺點

性能開銷 大- 反射操作的性能要比非反射操作的性能要差,應該在性能敏感的應用程式中頻繁調用的代碼段中避免。破壞封裝性 - 反射調用方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全問題。內部曝光 - 由於反射允許代碼執行在非反射代碼中非法的操作,例如訪問私有欄位和方法,所以反射的使用可能會導致意想不到的副作用,這可能會導致代碼功能失常並可能破壞可移植性。反射代碼打破了抽象,因此可能會隨著平臺的升級而改變行為。Class 對象

要想使用反射,首先需要獲得待操作的類所對應的 Class 對象。

反射的本質:在運行時,把每個Java 類中的各種屬性映射成一個個的 Java 對象。

假如定義了以下代碼:

User user = new User();

1、JVM 加載方法的時候,遇到new User(),JVM 會根據User的全限定名去加載User.class;

2、JVM 會去本地磁碟查找User.class文件並加載 JVM 內存中。

3、JVM 通過調用類加載器自動創建這個類對應的Class對象,並且存儲在 JVM 的方法區。

獲得 Class 的三種方法:

(1)使用 Class 類的 forName靜態方法

(2)調用 Object 的 getClass方法

反射創建實例對象

用 Class對象的 newInstance方法。用 Constructor對象的 newInstance 方法

java.lang.reflect包的核心接口和類

Member接口 - 反映關於單個成員(欄位或方法)或構造函數的標識信息。Field類 - 提供一個類的域的信息以及訪問類的域的接口。Method類 - 提供一個類的方法的信息以及訪問類的方法的接口。Constructor類 - 提供一個類的構造函數的信息以及訪問類的構造函數的接口。Array類 - 該類提供動態地生成和訪問 JAVA 數組的方法。Modifier類 - 提供了 static 方法和常量,對類和成員訪問修飾符進行解碼。Proxy類 - 提供動態地生成代理類和類實例的靜態方法。

相關焦點

  • Java編程中基礎反射詳細解析
    類加載指的是將類的class文件讀入內存中,並為之創建一個 java.lang.Class對象,也就是說程序使用任何類的時候,都會為其創建一個class對象。類加載器負責加載所有的類,系統為所有加載到內存中的類生成一個java.lang.Class 的實例。
  • Java之Random類的簡單介紹
    各位小夥伴這次小編要介紹的是Random類,它是用來形成隨機數字的,使用Random有三個步驟,與之前講的Scanner類差不多。第一步,導包:import java.util.Random第二步,創建:Random a=new Random();小括號是可以留空的第三步,使用:如果要獲取一個隨機數int數字(範圍是int所有範圍,有正負兩種):int num=a.nextInt();為了方便大家的理解,小編就先粘幾行代碼,是一個比較簡單的猜數字小遊戲,代碼如下:
  • Java反射機制深入詳解
    (來自Sun)JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。反射是從1.2就有的,後面的三大框架都會用到反射機制,涉及到類」Class」,無法直接new CLass(),其對象是內存裡的一份字節碼.
  • java之字符緩衝輸出流,BufferedWriter的簡單介紹
    各位小夥伴們,大家好在之前的文章中小編介紹了字節緩衝流的相關知識,這次小編要介紹的是字符緩衝輸出流,BufferedWriter,具體如下:java.io.BufferedWriter extends Writer
  • Java 反射:框架設計的靈魂
    在 Java 中,要使用一個類中的某個方法,「正向」都是這樣的:ArrayList list = new ArrayList(); list.add("reflection"); 那麼反向(反射)要如何實現?
  • java之字節緩衝輸出流,BufferedOutputStream的簡單介紹
    各位小夥伴們大家好,在之前的文章中,小編介紹了緩衝流的簡單原理,這次小編要介紹的是字節緩衝輸出流,BufferedOutputStream,具體如下:java.io.BufferedOutputStream extends OutputStreamBufferedOutputStream:字節緩衝輸出流繼承自父類的共性成員方法:
  • java操作ES整個流程介紹
    一 準備工作下載elasticsearch-6.7.0和展示ES數據的界面工具elasticsearch-head-master,本人電腦已安裝IntelliJ IDEA 2019.3 x64的java工具。簡單點,我們直接按默認配置學習。windows直接點擊elasticsearch.bat啟動ES。
  • Java之抽象方法的使用與及接口中抽象方法的簡單介紹
    各位小夥伴們大家好,這次小編要介紹的是Java當中的接口,什麼是接口呢?接口就是多個類的公共規範,是一中引用數據類型,最重要的內容就是其中的抽象方法。public interface 接口名稱{//接口內容}備註:換成關鍵字interface之後,編譯生成的字節碼文件仍然是:.java-->.class接口中包含的內容有
  • Java基礎教程:java反射機制教程
    請看下面的代碼: 這是一個最簡單不過的類,當我們使用的時候直接new出來一個User對象即可。這時候java語言在設計的時候為我們提供了一個機制,就是反射機制,他能夠很方便的去解決我們的問題。
  • 淺談Java中的幾種隨機數
    看似簡單,但有時我們也會忽略了一些有趣的功能。我們從書本上學到什麼?最明顯的,也是直觀的方式,在Java中生成隨機數隻要簡單的調用:java.lang.Math.random() 在所有其他語言中,生成隨機數就像是使用Math工具類,如abs, pow, floor, sqrt和其他數學函數。
  • Java8 lambda表達式語法
    本文是該系列的第一篇,主要介紹Java8對屌絲碼農最有吸引力的一個特性—lambda表達式。java8的安裝工欲善其器必先利其器,首先安裝JDK8。過程省略,大家應該都可以自己搞定。但是有一點這裡強調一下(Windows系統):目前我們工作的版本一般是java 6或者java 7,所以很多人安裝java8基本都是學習為主。這樣就在自己的機器上會存在多版本的JDK。
  • Java之File類的構造方法
    各位小夥伴們大家好,在之前的文章中,小編介紹了Java之File類的簡單介紹,File類的靜態成員變量,這次小編要介紹的是File類的構造方法小編先來介紹一下構造方法1:File(String pathname)通過給定路徑名字符串轉換為抽象路徑名來創建一個新File實例參數:String pathname:字符串的路徑名稱路徑可以是以文件結尾
  • 詳細介紹Java多態性(一)
    詳細介紹Java多態性(一) 本文介紹的是JAVA的多態性,希望對你有幫助,一起來看。下面介紹java的多態性。面向對象編程有三個特徵,即封裝、繼承和多態。封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。繼承是為了重用父類代碼,同時為實現多態性作準備。那麼什麼是多態呢?方法的重寫、重載與動態連接構成多態性。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。提到C++語言,很多人發現在使用過程中最容易出現的錯誤就是內存管理,而java有自動垃圾回收器,不用擔心內存。簡單總結如下:比較大眾,目前最熱門的程式語言之一語言是純面向對象的。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • Java基礎-instanceof用法揭秘
    main(String[] args) {Point p = new Point();//Element e = new Element();p = (Point) new Object();System.out.println(p instanceof Point);}}猛一看,沒事問題,編譯也沒有問題,可是運行時報錯:Exception in thread "main" java.lang.ClassCastException
  • 跟我學java編程—深入理解for語句的嵌套循環
    前面已經介紹了嵌套循環的概念,並通過示例介紹了while循環和do-while循環嵌套的情況。本節介紹for循環結構,for循環也可以嵌套。不僅如此,for循環還可以和其它的循環結構混合嵌套。示例1:用「*」輸出一個菱形圖案,圖案如下: 在D盤Java目錄下,新建「ForSample1.java」文件。用記事本打開「ForSample1.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示for嵌套循環的使用方法。
  • 詳細介紹Java多態性(二)
    java 的這種機制遵循一個原則:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。1. 如果a是類A的一個引用,那麼,a可以指向類A的一個實例,或者說指向類A的一個子類。2.
  • Java反射初探 ——「當類也學會照鏡子」
    而這些信息就是類的基本的組成: 方法,成員變量和構造器 事實上,和我們上面所介紹的Class類和Class對象相似的是,一個類中的方法,成員變量和構造器也分別對應著一個對象 1.每個方法都對應有一個保存和該方法有關信息的Method對象, 這個對象所屬的類是java.lang.reflect.Method
  • 跟我學java編程—Java邏輯運算符
    示例1:邏輯運算符在D盤Java目錄下,新建「LogicSample.java」文件。用記事本打開「LogicSample.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示邏輯運算符的用法。類似語句「bJudge = !