0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解Java基礎知識點反射

華為開發(fā)者社區(qū) ? 來源:華為云社區(qū) ? 作者:breakDraw ? 2021-04-09 13:47 ? 次閱讀

Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為java語言的反射機制。

反射就是把java類中的各種成分映射成一個個的Java對象。

例如:一個類有:成員變量、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)

反射

Q:調用類對象.class 和 forName(類名)的區(qū)別?

Class《A》 classA = A.class;Class《A》 classA = Class.forName(“A”);

A:僅使用.class不能進行第一次靜態(tài)初始化, forname函數(shù)則可以例如B是A的基類,下面這段代碼如何?假設有父子2個類,如下:

static class Parent { }

static class Son extends Parent{}

Q:用instanceof 可以和父類比較嗎,且會返回true嗎?

Son son = new Son(); if (son instanceof Parent) { System.out.println(“a instanof B”); }

A:可以比較,且返回true。

Q:用getClass并用== 可以和父類比較嗎,且會返回true嗎,下面這樣:注意A是B的子類。

Son son = new Son(); if (son.getClass() == Parent.class){ System.out.println(“son class == Parent.class”); }

A:不可以,編譯就會報錯了。和Class《泛型》的 ==號比較有關。

a390f33a-9831-11eb-8b86-12bb97331649.png

因為getClass返回的是《? extends Son》, .class返回的是Class《Parent》

Q:用getClass并用.equals可以和父類比較嗎,且會返回true嗎,下面這樣:

Son son = new Son(); if (son.getClass().equals(Parent.class)){ System.out.println(“son class.equals(Parent.class)”); }

A:可以比較,正常編譯, 但是會返回false,即不相等!

Q:getDeclaredXXX 有哪幾種?A:5種:

注解Annotation

內部類Classed

構造方法Construcotor

字段Field

方法Method

a3c49122-9831-11eb-8b86-12bb97331649.jpg

Q:getMethods()返回哪些方法, getDeclaredMethods()會返回哪些方法?

A:getMethods()返回 本類、父類、父接口 的public方法getDeclaredMethods()只 返回本類的 所有 方法其他getXXX和getDeclaredXXX的區(qū)別同理。拿到Filed、Method、Constructor之后咋用

Method可以invoke(object, args)

Constructor可以newInstance(Object…)來做構造調用。

Filed可以用get(object)、set(object)來設置屬性值。

Q:反射拿到Method對象后, 該對象.getModifiers() 是干嘛的?

A:返回該方法的修飾符,并且是1個整數(shù)。

a3e722aa-9831-11eb-8b86-12bb97331649.jpg

Q:下面這段代碼會發(fā)生什么?

package com.huawei.test

public class A { public A(int i ) { System.out.printf(“i=” +i); }

public static void main(String[] args) { try { A a = (A)Class.forName(“com.huawei.test.A”).newInstance(); } catch (ClassNotFoundException e) { System.out.printf(“ClassNotFoundException”); } catch (InstantiationException e) { System.out.printf(“InstantiationException”); } catch (IllegalAccessException e) { System.out.printf(“IllegalAccessException”); } }}

A:打印InstantiationException初始化錯誤。因為A沒有默認構造器了,所以不可以用newInstance來構造。應該改成這樣,通過獲取正確的構造器來進行構造。

A a = (A)Class.forName(“A”).getConstructor(int.class).newInstance(123);

Q:如何提高反射的效率?

A:

使用高性能反射包,例如ReflectASM

緩存反射的對象,避免每次都要重復去字節(jié)碼中獲取。(緩存!緩存?。?/p>

method反射可設置method.setAccessible(true)來關閉安全檢查。

盡量不要getMethods()后再遍歷篩選,而直接用getMethod(methodName)來根據(jù)方法名獲取方法

利用hotspot虛擬機中的反射優(yōu)化技術(jit技術)

參考資料: https://segmentfault.com/q/1010000003004720https://www.cnblogs.com/coding-night/p/10772631.html

Q:用反射獲取到的method對象, 是返回一個method引用,還是返回1個拷貝的method對象?

A:反射拿method對象時, 會做一次拷貝,而不是直接返回引用,因此最好對頻繁使用的同一個method做緩存,而不是每次都去查找。

a406f53a-9831-11eb-8b86-12bb97331649.jpg

Q:getMethods()后自己做遍歷獲取方法,和getMethod(methodName) 直接獲取方法, 為什么性能會有差異?

A:getMethods() 返回method數(shù)組時,每個method都做了一次拷貝。getMethod(methodName)只會返回那個方法的拷貝, 性能的差異就體現(xiàn)在拷貝上。

a43a31b6-9831-11eb-8b86-12bb97331649.jpg

Q:獲取方法時,jvm內部其實有緩存,但是返回給外部時依然會做拷貝。那么該method的緩存是持久存在的嗎?

A:不是持久存在的,內存不足時會被回收。源碼如下:

a458e188-9831-11eb-8b86-12bb97331649.png

private Class.ReflectionData《T》 reflectionData() { SoftReference《Class.ReflectionData《T》》 reflectionData = this.reflectionData; int classRedefinedCount = this.classRedefinedCount; Class.ReflectionData rd; return reflectionData != null && (rd = (Class.ReflectionData)reflectionData.get()) != null && rd.redefinedCount == classRedefinedCount ? rd : this.newReflectionData(reflectionData, classRedefinedCount);}

a4941dac-9831-11eb-8b86-12bb97331649.png

可以看到這是一個軟引用。

軟引用的定義:內存緊張時可能會被回收,不過也可以通過-XX:SoftRefLRUPolicyMSPerMB參數(shù)控制回收的時機,只要發(fā)生GC就會將其回收。

如果reflectionData被回收之后,又執(zhí)行了反射方法,那只能通過newReflectionData方法重新創(chuàng)建一個這樣的對象了。

Q:反射是線程安全的嗎?

A:是線程安全的。獲取反射的數(shù)據(jù)時,通過cas去獲取。cas概念可以見多線程一節(jié)。

a4d546d8-9831-11eb-8b86-12bb97331649.jpg

Q:

a普通方法調用

b反射方法調用

c關閉安全檢查的反射方法調用,性能差異如下:

a502ddf0-9831-11eb-8b86-12bb97331649.jpg

b反射方法調用和c關閉安全檢查的反射方法調用的性能差異在哪?普通方法調用和關閉安全檢查的反射方法調用的性能差異在哪?

A:

安全檢查的性能消耗在于

SecurityManager.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);

這項檢測需要運行時申請

RuntimePermission(“accessDeclaredMembers”)

所以如果不考慮安全檢查, 對反射方法調用invoke時, 應當設置 Method#setAccessible(true)

普通方法和反射方法的性能差異在于

Method#invoke 方法會對參數(shù)做封裝和解封操作

需要檢查方法可見性

需要校驗參數(shù)

反射方法難以內聯(lián)

JIT 無法優(yōu)化
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 反射
    +關注

    關注

    0

    文章

    66

    瀏覽量

    15837
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20026

原文標題:爆文速遞| Java程序員都要懂得知識點:反射

文章出處:【微信號:Huawei_Developer,微信公眾號:華為開發(fā)者社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    模擬電子技術知識點問題總結概覽

    給大家分享模擬電子技術知識點問題總結。
    的頭像 發(fā)表于 05-08 15:16 ?956次閱讀
    模擬電子技術<b class='flag-5'>知識點</b>問題總結概覽

    射頻與微波基礎知識

    射頻與微波基礎知識
    的頭像 發(fā)表于 01-16 10:05 ?674次閱讀
    射頻與微波<b class='flag-5'>基礎知識</b>

    淺談初級電工必備知識點

    對于初學電工的朋友來說,掌握一些基礎且實用的知識點是非常重要的。本文旨在分享初級電工應該掌握的核心知識,幫助新手電工更好地入門和提升技能。
    的頭像 發(fā)表于 12-26 10:44 ?865次閱讀

    TCP協(xié)議面試常問知識點總結

    TCP 作為傳輸層的協(xié)議,是一個IT工程師素養(yǎng)的體現(xiàn),也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。
    的頭像 發(fā)表于 12-15 10:38 ?660次閱讀
    TCP協(xié)議面試常問<b class='flag-5'>知識點</b>總結

    電氣技術基礎知識

    電氣技術基礎知識
    的頭像 發(fā)表于 12-14 09:11 ?1344次閱讀
    電氣技術<b class='flag-5'>基礎知識</b>

    開關模式下的電源電流如何檢測?這12個電路&amp;10個知識點講明白了

    開關模式下的電源電流如何檢測?這12個電路&10個知識點講明白了
    的頭像 發(fā)表于 12-06 16:04 ?660次閱讀
    開關模式下的電源電流如何檢測?這12個電路&amp;10個<b class='flag-5'>知識點</b>講明白了

    電子元器件的基礎知識

    電子元器件的基礎知識
    的頭像 發(fā)表于 12-04 10:42 ?4557次閱讀
    電子元器件的<b class='flag-5'>基礎知識</b>

    c語言程序設計基礎知識點

    程序設計的基礎知識點。 首先,我們將從C語言的數(shù)據(jù)類型和變量開始。C語言提供了多種數(shù)據(jù)類型,包括整數(shù)、浮點數(shù)、字符和指針等。整數(shù)類型包括int、long和short等,浮點數(shù)類型包括float和double等,字符類型用于存儲ASCII字符,指針類型用
    的頭像 發(fā)表于 11-27 15:25 ?1334次閱讀

    數(shù)字電位計知識點

    電子發(fā)燒友網站提供《數(shù)字電位計知識點.pdf》資料免費下載
    發(fā)表于 11-24 16:08 ?7次下載
    數(shù)字電位計<b class='flag-5'>知識點</b>

    三菱和西門子PLC輸入接線知識點

    三菱和西門子PLC輸入接線知識點
    的頭像 發(fā)表于 11-21 10:01 ?592次閱讀
    三菱和西門子PLC輸入接線<b class='flag-5'>知識點</b>

    OFDM技術知識點

    電子發(fā)燒友網站提供《OFDM技術知識點.rar》資料免費下載
    發(fā)表于 11-18 14:25 ?0次下載
    OFDM技術<b class='flag-5'>知識點</b>

    Linux文件系統(tǒng)知識點詳解

    今天浩道跟大家分享關于Linux文件及目錄屬性知識點的硬核干貨,可以說只要你認真看完這篇文章內容,其相關知識點都不在話下,感興趣又想快速掌握的小伙伴們,可以收藏起來隨時查看!
    的頭像 發(fā)表于 11-02 09:29 ?556次閱讀
    Linux文件系統(tǒng)<b class='flag-5'>知識點</b><b class='flag-5'>詳解</b>

    51單片機的知識點

    電子發(fā)燒友網站提供《51單片機的知識點.pdf》資料免費下載
    發(fā)表于 11-01 17:32 ?2次下載

    開關模式下的電源電流如何檢測?這12個電路&amp;10個知識點講明白了

    開關模式下的電源電流如何檢測?這12個電路&10個知識點講明白了
    的頭像 發(fā)表于 10-17 16:09 ?689次閱讀
    開關模式下的電源電流如何檢測?這12個電路&amp;10個<b class='flag-5'>知識點</b>講明白了

    機器視覺與視覺檢測知識點的歸納

    電子發(fā)燒友網站提供《機器視覺與視覺檢測知識點的歸納.pdf》資料免費下載
    發(fā)表于 10-07 16:39 ?3次下載
    機器視覺與視覺檢測<b class='flag-5'>知識點</b>的歸納