zoukankan      html  css  js  c++  java
  • 自己实现的反射

    package main
    
    import (
        "errors"
        "fmt"
        "reflect"
    )
    
    type Student struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }
    
    type Teacher struct {
        name string
    }
    
    func (Student) Greet() {
        fmt.Println("hello")
    }
    
    func GetStructToJson(s interface{}) (map[interface{}]interface{}, error) {
    
        val := reflect.ValueOf(s)
        typ := reflect.TypeOf(s)
        kind := val.Kind()
        tm := make(map[interface{}]interface{})
        if kind != reflect.Struct {
            return tm, errors.New("不是struct")
        } else {
            for i := 0; i < typ.NumField(); i++ {
                key := typ.Field(i).Tag.Get("json")
                tm[key] = ConvertFieldValue(val.Field(i))
            }
        }
        for i := 0; i < val.NumMethod(); i++ {
            fmt.Println(typ.Method(i).Name)
            val.Method(i).Call(nil) //如果方法绑定的是指针对象这里不会执行读不到
        }
        return tm, nil
    
    }
    
    func ConvertFieldValue(value reflect.Value) interface{} {
        if value.Kind().String() == "string" {
            return value.String()
        }
        if value.Kind().String() == "int" {
            return value.Int()
        }
        return nil
    }
    
    func main() {
        m := Student{"夏华楼", 26}
        rm := reflect.ValueOf(&m).Elem() //反射修改结构体内容
        if rm.CanSet(){
            rm.Field(0).SetString("Jerry")
        }
        v, _ := GetStructToJson(m)
        fmt.Println(v)
        fmt.Println(Teacher{"allen"})
    }




  • 相关阅读:
    getJson
    mongodb在java中的查询
    Fragment
    android权限
    json输出
    Android Service
    javascript
    android
    Myeclipse启动报错: Invalid 'log4jConfigLocation' parameter
    Android-Activity生命周期
  • 原文地址:https://www.cnblogs.com/hualou/p/12069854.html
Copyright © 2011-2022 走看看