乙個類中,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也可以定...