Java反射的基本使用

這裏是修真院後端小課堂,每篇分享文從html

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】java

八個方面深度解析後端知識/技能,本篇分享的是:git

【Java反射的基本使用】github

背景介紹spring

JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;後端

對於任意一個對象,都可以調用它的任意一個方法;框架

這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制函數

 

知識剖析this

類的加載編碼

類的加載指的是將類的class文件讀入內存中,併爲之建立一個java.lang.Class對象。

也就是說,當程序使用任何類時,系統都會爲之創建一個java.lang.Class對象
類的加載由類加載器完成,類加載器一般由JVM提供

 

類對象

類是某一類對象的抽象,一樣,Class是對類進行的抽象,類的本質實際上也是一個對象
類對象用來存儲類的基本信息:類大小,類名稱,類的版本,繼承層次,以及消息與函數的映射表等

 

編碼實戰

獲取類對象:
能夠經過

Class.forName,
類.class,
對象.getClass()
來得到類的類對象

建立對象:

1.使用Class對象的newInstance()方法來建立對應類的實例
2.使用Class對象獲取Constructor對象,再調用Constructor對象的NewInstance方法來建立對應的實例

訪問屬性:
Class對象的getField()方法能夠獲取該類的成員變量
而後使用Field對象提供的兩個方法能夠讀取和設置成員變量

1.getXxx(Object obj)
2.setXxx(Object obj,Xxx val)
調用方法:

經過Class對象的getMethod()能夠獲取指定的方法,返回一個Method對象
每一個Method方法對應一個方法,通關它的invoke()方法來調用相應的方法

 

具體演示

建立一個類:

public class Class1 {

public int YYY=0;
public String name="這是改以前的name";

public void say(){
    System.out.println("這是Class1的say方法");
}

public int getYYY() {
    return YYY;
}

public void setYYY(int YYY) {
    this.YYY = YYY;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}
獲取類對象:

String classname = "Class1";
Class Clazz = Class.forName(classname);
建立對象:

Constructor c = Clazz.getConstructor();
Class1 aa =(Class1) c.newInstance();
訪問並設置成員變量:

Field f1 = Clazz.getDeclaredField("name");
f1.set(aa,"wanger");
調用方法:

Method m = Clazz.getMethod("setName", String.class);
m.invoke(aa,"李四");
也能夠經過外部文件來配置要加載的類,經過修改文件中的信息來改變想要加載的類
在src目錄下創建一個文本文件,內容爲:

class=Service1
經過讀取外部文件類獲取類名,並利用獲取的類名來進行加載:

File f1 = new File("C:\Users\kelis\IdeaProjects\Spring_A\src\spring.txt");

Properties config = new Properties();
    config.load(new FileInputStream(f1));
  String className = (String) config.get("class");
    Class clazz = Class.forName(className);

 

更多討論:

反射和映射的區別

映射只是一種概念,一般是用代碼方式來表示種對應關係。
反射是一種技術,不少高級語言都有這種技術。具體做用就是經過一個獨立存在的對象,能夠找到該對象的其餘信息

 

反射有哪些應用場景呢

利用反射能夠實現動態加載所須要的類,而沒必要修改程序的源代碼
還由許多框架中都用到了反射技術,如spring,經過配置文件類設置想要加載的類

 

反射的做用,或者通俗解釋下反射

實現動態加載類,增長了程序的靈活性,多用於各類開發框架

 

 

PPT:https://ptteng.github.io/PPT/...

相關文章
相關標籤/搜索