Java反射學習

2021-07-12 03:26:57 字數 1929 閱讀 7570

應用在一些通用性較高的**中

框架的底層基於反射

在框架開發中,都是基於配置檔案開發,在配置檔案中配置子類,可以通過反射得到類中的所有內容,可以讓類中的某個方法執行

類中的所有內容:屬性、沒有引數的構造方法、有引數的構造方法、普通方法,都可以通過反射機制動態獲得。

那麼接下來就看看怎麼通過反射來獲得類中的內容,首先了解乙個類的載入過程:

1.編寫類的原始碼,儲存到硬碟;

2.編譯成class檔案;

3.把class檔案載入到記憶體通過jvm執行。

所以,只要得到了這個class,我們就可以得到這個類的所有內容。

首先,我們建立乙個person類,有name和age兩個屬性,有引數和無引數的建構函式還有封裝屬性的基本方法:

package jimo.reflect;

public

class

person

public

person(string name, int age)

//普通方法

public string getname()

public

void

setname(string name)

public

intgetage()

public

void

setage(int age)

}

首先,了解通過反射獲得類有三種方式:

方式1:類名.class

方式2:物件.getclass()

方式3:class.forname(「路徑」)

用**看起來就是這樣:

public static void main(string args) throws classnotfoundexception
注意:路徑包括包名,copy小技巧:在類名上右鍵:

現在可以來獲得類的屬性,構造方法,普通方法了。

1 . 用反射獲取物件例項,不用new:

public

void

getinstance() throws classnotfoundexception, instantiationexception, illegalacces***ception

2 . 用反射獲取類的屬性:

public

void

getfield() throws classnotfoundexception, nosuchfieldexception, securityexception, instantiationexception, illegalacces***ception catch (illegalargumentexception e) catch (illegalacces***ception e)

}

3 . 通過反射操作有參建構函式:

為什麼是有參呢?因為無參已經做過了。

public void testconstruct() throws exception
4 . 反射操作普通方法:

public void testmethod() throws exception
那如果普通方法是靜態的怎麼做呢?很簡單,因為靜態方法直接由類呼叫,不通過例項,所以invoke第乙個引數填 null 就好。

可以看到:

1. .setaccessible(true);這個方法可以使私有屬性和方法被訪問,相當於失去了封裝的效果。

2. 我們很少用到反射來獲取例項,著重理解反射的原理。

Java 反射學習

在學習之前有必要知道類載入器和例項物件 class和newinstance 的區別 這篇文章寫的蠻不錯的 1.通過反射建立物件 反射無參構造方法建立例項 class clazz class.forname 類路徑 如 com.xx.類名 object o clazz.newinstance syst...

C 反射學習

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...

php 反射學習

早知道php 有反射的概念一直沒抽出空來。今天看書裡面有個這玩意 弄個例子搞搞。不過似乎專案中用處不大。印象中似乎就 thinkphp 3.1 裡面的 控制器呼叫使用了反射 class person public function set name value public function get...