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"})
    }




  • 相关阅读:
    Java openrasp学习记录(一)
    Java ASM3学习(3)
    Java ASM3学习(2)
    Java Instrumentation插桩技术学习
    Java ASM3学习(1)
    从JDK源码学习HashSet和HashTable
    从JDK源码学习HashMap
    从JDK源码学习ArrayList
    Java XXE漏洞典型场景分析
    CVE-2020-7961 Liferay Portal 复现分析
  • 原文地址:https://www.cnblogs.com/hualou/p/12069854.html
Copyright © 2011-2022 走看看