關於Java反射的一些事

2021-06-12 11:07:23 字數 1698 閱讀 2038

乙個類中,private的屬性或方法,如何對這些屬性進行讀寫操作或方法進行呼叫呢,答案就是反射。

最近在寫單元測試用例時,發現通過反射來測試一些private的方法或設定private的屬性非常實用。

先看定義乙個類,其中有乙個private的屬性和乙個private的方法,並且建構函式也是乙個private

public class context 

private void process(string name, listdatalist)

}

當然,實際情況不會有這樣的物件,這裡只是為了演示用。接下來,首先要構造這個物件,如果有public的建構函式,我們知道可以這樣寫:

class.forname("packagename.classname").newinstance();
或者

classloader cl = thread.currentthread().getcontextclassloader();

cl.loadclass("packagename.classname").newinstance();

以上構造方法預設呼叫public的無參建構函式,如果建構函式是private的呢?那麼可以這樣寫:

classloader cl = thread.currentthread().getcontextclassloader();

class<?> clazz = cl.loadclass("packagename.classname");

constructor<?> c = clazz.getdeclaredconstructor();

// set accessible

c.setaccessible(true);

context obj = (context) c.newinstance(new object{});

獲取私有域的方法:

field field = obj.getclass().getdeclaredfield("name");

// set accessible

field.setaccessible(true);

// set value

field.set(obj, "kkk");

// 也可以獲取所有的域

field fields = obj.getclass().getdeclaredfields();

獲取私有方法並執行:

method method = obj.getclass().getdeclaredmethod("process", new class<?>);

// set accessible

method.setaccessible(true);

// invoke

method.invoke(obj, new object);

// 也可以獲取所有的方法

method methods = obj.getclass().getdeclaredmethods();

上面用到了class、constructor、field、method這幾個反射相關的類。

還有很多好用的方法,在jdk的api文件中有詳細的解釋

關於反射一些總結

1.建立實體 person如下類 view code public class person displayattribute description 年齡 public int age displayattribute description 返回方法 public string getval p...

關於反射的一些總結

關於反射的一些總結 1 load,loadfrom和loadfile load 只載入本地程式集中指定的類 通過命名空間等方式指定 loadfrom 通過外部相對或者絕對路徑載入指定的類庫或者exe等檔案,且重複載入相同程式集僅第一次有效 如果該程式集引用其它程式集,會被自動載入。loadfile ...

關於const的一些事

一 const能做哪些事情呢?1 可以定義const常量 2 可以修飾函式的形參和返回值 3 可以修飾函式的定義體 意義 被const修飾的東西都要受到強制的保護,可以預防意外的變動,能提高程式的健壯性 二 const和 define有啥不同的呢?我們知道const定義的是常量,define也可以定...