内容简介:利用反射,不仅可以获取信息,还可以创建实例,执行函数和方法。就是反射代理执行。创建实例的前提是具有我们创建了实例,一直都是通过反射的方式操作的。
1 概述
利用反射,不仅可以获取信息,还可以创建实例,执行函数和方法。就是反射代理执行。
2 创建实例
创建实例的前提是具有 reflect.Type
对象,基于此创建实例。使用 reflect.TypeOf()
函数,可以获取得到某类型的 reflect.Type
对象,演示如下:
typeStu := reflect.TypeOf(Stu{}) s := reflect.New(typeStu) s.Elem().FieldByName("Name").SetString("Hank") // 利用反射设置结构体字段值 fmt.Println(s.Elem().FieldByName("Name").String()) // Hank
我们创建了实例,一直都是通过反射的方式操作的。
3 调用函数
如果值反射对象 reflect.Value
反射的是函数时,可以通过 reflect.Value
调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value
构造后传入 Call()
方法中传参。调用完成时,函数的返回值通过 []reflect.Value
返回。 演示如下:
func fn(p1, p2 int) int { return p1 + p2 } func main() { valueFunc := reflect.ValueOf(fn) paramList := []reflect.Value{ reflect.ValueOf(22), reflect.ValueOf(20), } // 反射调用函数 resultList := valueFunc.Call(paramList) // 获取第一个返回值, 取整数值 fmt.Println(resultList[0].Int()) // 42 }
4 调用方法
整体与调用函数一致,额外的需要先通过对象的值反射获取对象方法的反射对象,再使用 Call()
调用,示例:
type Stu struct { Name string } func (this *Stu) Fn(p1, p2 int) int { return p1 + p2 } func main() { s := &Stu{"Hank"} valueS := reflect.ValueOf(s) method := valueS.MethodByName("Fn") paramList := []reflect.Value{ reflect.ValueOf(22), reflect.ValueOf(20), } resultList := method.Call(paramList) fmt.Println(resultList[0].Int()) // 42 }
完! 原文出自: 小韩说课 微信关注:小韩说课
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Golang利用反射reflect动态调用方法
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
- Golang 通过反射的方式调用结构体方法
- Java 反射调用与面向对象结合使用产生的惊艳
- Golang反射机制的实现分析——reflect.Type方法查找和调用
- Go语言反射之类型反射
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法艺术与信息学竞赛
刘汝佳 / 清华大学出版社 / 2004-1 / 45.00元
《算法艺术与信息学竞赛》较为系统和全面地介绍了算法学最基本的知识。这些知识和技巧既是高等院校“算法与数据结构”课程的主要内容,也是国际青少年信息学奥林匹克(IOI)竞赛和ACM/ICPC国际大学生程序设计竞赛中所需要的。书中分析了相当数量的问题。 本书共3章。第1章介绍算法与数据结构;第2章介绍数学知识和方法;第3章介绍计算机几何。全书内容丰富,分析透彻,启发性强,既适合读者自学,也适合于课......一起来看看 《算法艺术与信息学竞赛》 这本书的介绍吧!