型別資訊:是靜態的元資訊,是預先定義好的
值資訊:是程式執行過程中動態改變的
獲取型別資訊:reflect.typeof,是靜態的
獲取值資訊:reflect.valueof,是動態的
反射獲取inte***ce值資訊
package main
import (
"fmt"
"reflect"
)//反射獲取inte***ce值資訊
func reflect_value(a inte***ce{})
}func main()
反射修改值資訊
package main
import (
"fmt"
"reflect"
)//反射修改值
func reflect_set_value(a inte***ce{})
}func main()
檢視型別、欄位和方法
package main
import (
"fmt"
"reflect"
)// 定義結構體
type user struct
// 綁方法
func (u user) hello()
// 傳入inte***ce{}
func poni(o inte***ce{})
fmt.println("***************==方法********************")
for i := 0; i < t.nummethod(); i++
}func main()
poni(u)
}
檢視匿名字段
package main
import (
"fmt"
"reflect"
)// 定義結構體
type user struct
// 匿名字段
type boy struct
func main() , "bj"}
t := reflect.typeof(m)
fmt.println(t)
// anonymous:匿名
fmt.printf("%#v\n", t.field(0))
// 值資訊
fmt.printf("%#v\n", reflect.valueof(m).field(0))
}
修改結構體的值
package main
import (
"fmt"
"reflect"
)// 定義結構體
type user struct
// 修改結構體值
func setvalue(o inte***ce{})
}func main()
setvalue(&u)
fmt.println(u)
}
呼叫方法
package main
import (
"fmt"
"reflect"
)// 定義結構體
type user struct
func (u user) hello(name string)
func main()
v := reflect.valueof(u)
// 獲取方法
m := v.methodbyname("hello")
// 構建一些引數
args := reflect.value
// 沒引數的情況下:var args2 reflect.value
// 呼叫方法,需要傳入方法的引數
m.call(args)
}
獲取欄位的tag
package main
import (
"fmt"
"reflect"
)type student struct
func main()
方法
package common
import (
"errors"
"reflect"
"strconv"
"time"
)//根據結構體中sql標籤對映資料到結構體中並且轉換型別
func datatostructbytagsql(data map[string]string, obj inte***ce{})
}//設定型別值
objvalue.fieldbyname(name).set(val)
}}//型別轉換
func typeconversion(value string, ntype string) (reflect.value, error) else if ntype == "time.time" else if ntype == "time" else if ntype == "int" else if ntype == "int8" else if ntype == "int32" else if ntype == "int64" else if ntype == "float32" else if ntype == "float64"
//else if .......增加其他一些型別的轉換
return reflect.valueof(value), errors.new("未知的型別:" + ntype)
}
呼叫)//product product定義乙個結構體
type product struct
func main()
productresult := &product{}
common.datatostructbytagsql(data, productresult)
fmt.println(*productresult)
//這塊是模擬mysql獲取所有的資料反射到結構體
alldata := map[string]string,,}
var productarray *product
for _, v := range alldata
common.datatostructbytagsql(v, allproduct)
}for _, vv := range productarray
}
c 通過反射 例項化類
1.用type 在 website 下 userdao userdao userdao type.gettype userdaopath getconstructor system.type.emptytypes invoke null 如果構造方法有引數的話,這樣。定義引數型別陣列 type tp...
C 反射例項 一 利用反射使用類庫
首先我們建立乙個類庫,將它生成為helloworld.dll,using system using system.collections.generic using system.text namespace webtest public class reflecttest inte ce1 set...
C 反射通過類名例項化類
在物件導向程式設計的時候,會遇到這樣的問題,乙個父類有多個子類,需要建立乙個父類的物件,再後面根據條件去把該物件例項化具體的某個子類,然後進行操作。當然用if else 或者switch來做也可以,但是後期擴充套件性不好,特別是要把這些類封裝成dll提供給被人用,更不合適了。這時候反射就提供了很好的...