C 使用反射機制獲取類資訊

2021-08-22 05:37:31 字數 2951 閱讀 4347

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...