1.用反射動態建立類例項,並呼叫其公有成員函式。
//新建乙個類庫專案,增加乙個getsum方法。
using system;
namespace classlibrary1
public int getsum(int x, int y)}}
//再另建乙個專案,在專案中引用上面生成的classlibrary1.dll
system.reflection.assembly a = system.reflection.assembly.loadfrom("classlibrary1.dll");
system.type t = a.gettype("classlibrary1.class1");
//動態生成classlibrary1.class類的例項
object theobj = system.activator.createinstance(t);
//引數資訊,getsum需要兩個int引數
system.type paramtypes = new system.type[2];
paramtypes[0] = system.type.gettype("system.int32");
paramtypes[1] = system.type.gettype("system.int32");
system.reflection.methodinfo mi = t.getmethod("getsum", paramtypes);
//引數值
object parameters = new object[2];
parameters[0] = 3;
parameters[1] = 4;
object returnvalue = mi.invoke(theobj, parameters);
console.writeline("classlibrary1.class1.getsum(3, 4) returns: ", returnvalue.tostring());
2.用反射訪問類的私有成員。
如果是c++,我們可以計算物件內成員的位置,然後偏移指標以訪問型別的所有非公開成員。但是.net物件完全受gc管理,位址根本無法得到,並且也無法通過指標呼叫方法。
當然... 這是一種很不值得推薦的技巧,訪問非公有成員很可能破壞物件狀態,造成不可預料的後果。但是無論如何,利用.net的反射機制可以做到。
比如這樣乙個類:
class myclass
set }
private string _privateproperty = "private property";
private string privateproperty
set }
protected void protectedmethod()
private void privatemethod()
} 除了預設的建構函式,沒有任何成員是公開的,但是我仍然想獲取和設定field和property的值,以及呼叫那兩個方法。方法是:
myclass mc = new myclass();
type t = typeof(myclass);
bindingflags bf = bindingflags.instance | bindingflags.nonpublic;
// fields
fieldinfo fi_protected = t.getfield("protectedfield",bf);
fieldinfo fi_private = t.getfield("privatefield",bf);
console.writeline(fi_protected.getvalue(mc));
console.writeline(fi_private.getvalue(mc));
fi_private.setvalue(mc,"new private field");
console.writeline(fi_private.getvalue(mc));
console.writeline();
// properties
propertyinfo pi_protected = t.getproperty("protectedproperty", bf);
propertyinfo pi_private = t.getproperty("privateproperty", bf);
console.writeline(pi_protected.getvalue(mc,null));
console.writeline(pi_private.getvalue(mc,null));
pi_private.setvalue(mc,"new private property",null);
console.writeline(pi_private.getvalue(mc,null));
console.writeline();
// methods
methodinfo mi_protected = t.getmethod("protectedmethod", bf);
methodinfo mi_private = t.getmethod("privatemethod", bf);
mi_protected.invoke(mc,null);
mi_private.invoke(mc,null);
console.readline();
輸出:protected field
private field
new private field
protected property
private property
new private property
protected method invoked
private method invoked
事件,一樣可以操作,
eventinfo :-)
Java 使用反射獲取型別資訊
總結最近寫了大量需要根據類屬性的型別反射注入值的 總結了以下常用的反射技巧 在這個類中,有普通的string型別,有陣列型別,有帶泛型的list型別,有巢狀list型別,以及有多個泛型引數的簡單類,這個類將作為我們後面的內容的基礎。我們這一次部落格解析如何使用反射獲取到不同屬性的型別值。public...
php 利用反射API獲取類資訊
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!php具有完整的反射api,可以對類 介面 函式 方法和擴充套件進行反向工程。反射api並提供方法取出函式 類和方法中的文件注釋。本文將介紹使用php反射api獲取類資訊的方法,提供完整演示 ref new reflectionclass clas...
C 的類反射多型機制
一 基類 class icmdstatic 二 子類1 class ccmd502 public icmdstatic 三 子類2 class ccmd503 public icmdstatic 四 類工廠模板標頭檔案 ifndef genericfactoryh define genericfac...