成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

吊打面試官系列:說說反射的用途及實現?

開發 后端
反射是Java程序開發語言的特征之一,它允許動態地發現和綁定類、方法、字段,以及所有其他的由于有所產生的的元素。通過反射,能夠在需要時完成創建實例、調用方法和訪問字段的工作。

 

反射是什么?

 

反射是Java程序開發語言的特征之一,它允許動態地發現和綁定類、方法、字段,以及所有其他的由于有所產生的的元素。通過反射,能夠在需要時完成創建實例、調用方法和訪問字段的工作。

反射機制主要提供功能

 

  • 在運行時判斷任意一個對象所屬的類
  • 在運行時構造任意一個類的對象
  • 在運行時判斷任意一個類所具有的成員變量和方法
  • 在運行時調用任意一個對象的方法,通過反射甚至可以調用到private修飾的方法
  • 生成動態代理

反射在牛逼框架中的使用

 

  • Spring 框架的 IOC 基于反射創建對象和設置依賴屬性。
  • Spring MVC 的請求調用對應方法,也是通過反射。
  • JDBC 的 Class#forName(String className) 方法,也是使用反射。

反射中,Class.forName 和 ClassLoader 區別?

 

這兩者,都可用來對類進行加載。差別在于:

  • Class#forName(…) 方法,除了將類的 .class 文件加載到JVM 中之外,還會對類進行解釋,執行類中的 static 塊。
  • ClassLoader 只干一件事情,就是將 .class 文件加載到 JVM 中,不會執行 static 中的內容,只有在 newInstance 才會去執行 static 塊。

反射的常用類

 

Java中反射相關的類大部分都在rt.jar下java.lang.reflect中,其實需要的類并不多,主要有以下幾個:

  1. java.lang.Class 

Class類的實例表示正在運行的Java類和接口。

  1. java.lang.reflect.Field 

提供有關類或者接口的屬性信息,以及對它的動態訪問權限。反射的字段可能是一個類(靜態)屬性或實例屬性,簡單的理解可以把它看成一個封裝反射類的屬性的類。有點繞,慢慢體會吧。

  1. java.lang.reflect.Constructor 

提供關于類的單個構造方法的信息以及對它的訪問權限。這個類和Field類不同,Filed類封裝類反射類的屬性,而Constructor類則封裝類反射類的構造方法。

  1. java.lang.reflect.Method 

提供關于類和接口上單個方法的信息。所反映的方法可能是類方法或者實例方法(包括抽象方法)。這個類不難理解,他的作用就是用來封裝反射類方法的一個類。

  1. java.lang.reflect.Modifier 

提供了用于解碼類和成員訪問修飾符的靜態方法和常量。修飾符集合被表示為具有表示不同修飾符的不同位位置的整數。

  1. java.lang.reflect.Array 

提供了動態創解決數組和訪問數組的靜態方法,該類中的所有方法都是靜態方法。

反射的優缺點

 

優點

  • 可以在程序運行的過程中,操作這些對象。
  • 可以解耦,提高程序的可擴展性。

缺點

  • 因為是JVM操作,所以對于性能來說會有所下降。
  • 容易對程序源碼造成一定的混亂。

探索 Class

 

java文件編譯后變成class文件,class文件被類加載器加載到內存中,并且JVM根據其字節數組創建了對應的Class對象。

Class類是Java反射的起源,針對任何一個我們想使用的類,只有先為它產生一個Class對象,接下來就可以通過Class對象獲取其他的信息。

JVM為每個類管理著一個獨一無二的Class對象,當我們需要創建每個類的對象時,JVM會檢查所要加載的類對應的Class對象是否已經存在。不存在,則JVM會根據類加載機制加載并創建對應的Class對象,最后使用Class對象創建出我們通常使用的實例對象。

獲取Class類的三種方式

1.調用Object類的getClass()方法獲得Class對象。

2.使用Class類的forName("com.tian.XXX")靜態方法獲取與字符串對應的對象(類或接口的全限定名)。

3.使用.class獲取該類性的Class對象。

Class常用方法

 

方法非常之多。

獲取類信息

了解了Java反射的詳細細節之后,我們可以使用反射機制來獲取類中的信息。

 

創建對象

使用無參構造方法創建對象

比如說下面這段代碼:

  1. Class clazz = Class.forName("java.lang.String"); 
  2. String str = (String)clazz.newInstance(); 

這里需要注意,這個類必須是有無參構造方法,不然這種方式會報錯的。

使用有參構造方法

可以使用三個步驟來完成:

1.獲取指定類對應的Class對象

2.通過Class對象獲取滿足指定參數類型要求的構造方法類對象

3.調用指定的Constructor對應的newInstance方法,傳入對應的參數值,創建出我們想要的實例對象。

  1. Class clazz = Class.forName("java.lang.String"); 
  2. Constructor constructor = clas.getConstructor(String.class); 
  3. String str = (String)constructor.newInstance("hello world"); 

這樣就創建了一個String對象實例。

調用方法

前面已經聊過Method這個類,我們可以通過Method類中的invoke方法動態調用器方法。

  1. public final class Method extends Executable { 
  2.     public Object invoke(Object obj, Object... args){ 
  3.     //.... 
  4.     } 

這個方法的第一個參數是一個對象類型,表示要在指定的這個對象上調用這個方法(方法名稱)。第二個參數是可變參數,用來給這個方法傳遞參數值;

invoke方法里返回的值用來表示動態調用指定方法后的返回值。如果調用私有的方法,先調用setAccessible(true)來曲線Java語言堆笨方法的訪問檢查,然后再調用invoke方法來真正執行這個私有方法。

訪問成員變量的值

使用反射可以獲取類的成員變量的對象代表,成員變量的對象代表是

java.lang.reflect.Field類的實例,可以使用他的getXyy()方法來獲取指定對象上的值,也可以使用setXyy()方法來動態修改指定對象上的值,其中xyy是成員變量。

比如說:setAge(22);其中age就是成員變量。

操作數組

數組也是一個度一項,可以通過反射來查看數組的各個屬性的信息,比如

  1. ingt [] intArr=new Int[10]; 
  2. Sysytem.out.prinlt("數組類型:"+intArr.getClass.getComponentType().getName()); 
  3.  
  4. Object obj=Array.newInstance(int.class, 10); 
  5. //維數組賦值 
  6. for(int i=0;i<10;i++){ 
  7.     Array.setInt(obj,i,i); 
  8. for(int i = 0;i<10;i++){ 
  9.     System.out.print("第"+i+"好元素為"+Array.getInt(obj,i)); 

反射與動態代理

代理模式是Java中使用頻率相當高的設計模式之一,尤其是在牛逼的框架中,Spring,Mybatis,Dubbo等框架中。

其中反射就是一個很好的應用。

靜態代理模式我們就沒有必要提他了,相當于一個業務需要代理,你就得給他搞一個代理類。全是手動搞出來的。

動態代理的原理就是,在程序運行時候根據需要動態地創建目標類的代理對象,典型應用場景:

  • JDK動態代理
  • CGlib動態代理

關于動態代理,后面有專門的文章分析。

到此我們的反射相關的意見講完了。具體還是建議自己下去手動敲敲代碼,體會一下,便于更深刻的理解。

總結

 

面試被問到,建議回答以下幾個方面的內容:

1.反射是什么

2.提供了什么功能

3.常用類有哪些

4.優缺點是什么

5.其他框架中國的應用(動態代理)

本文轉載自微信公眾號「Java后端技術全?!?,可以通過以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2024-03-14 14:56:22

反射Java數據庫連接

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2025-04-08 00:00:00

@AsyncSpring異步

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-02-29 16:49:20

volatileJava并發編程

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-08-29 16:30:27

2024-08-12 17:36:54

2024-06-04 09:02:03

2025-02-28 00:00:00

2021-06-07 17:12:22

線程安全Atomic

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-03-01 11:33:31

2024-12-04 14:45:14

零拷貝技術CPU 拷貝Zero-copy

2021-05-20 08:34:03

CDN原理網絡

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线精品一区二区 | 欧美久久国产 | www操操 | 欧美国产免费 | 欧美日韩在线综合 | 中文字幕在线国产 | 欧美一级二级三级 | 欧美一级特黄aaa大片在线观看 | 国产美女在线精品免费 | 亚洲国产乱码 | 亚洲高清在线观看 | 午夜精品福利视频 | 久久久999免费视频 999久久久久久久久6666 | 天天草天天干天天 | 欧美视频中文字幕 | 日韩欧美一区在线 | 国产一区999 | 日韩一区二区三区四区五区六区 | 神马久久香蕉 | 久久久久久艹 | 999久久久久久久久6666 | 暴草美女 | 国产精品视频在 | 一本久久a久久精品亚洲 | 久久99精品久久久久久国产越南 | 久热精品在线播放 | 99热这里 | 91精品国产91久久综合桃花 | 中文日韩在线视频 | 国产精品久久久久久久久污网站 | 色综合视频 | 超级碰在线 | 91精品久久久久久久久久入口 | 午夜国产一级 | 日韩精品在线免费观看视频 | 蜜桃av人人夜夜澡人人爽 | 日韩电影在线一区 | 极品销魂美女一区二区 | 国产精品一区二区视频 | av午夜激情 | 国产一区二区观看 |