反射的快速入门

系统管理员 2021-07-24 19:08 403阅读 0赞

一 需求

1 编写一个案例,演示对基本数据类型、interface{}、reflect.Value 进行反射的基本操作。

2 编写一个案例,演示对结构体类型、interface{}、reflect.Value 进行反射的基本操作。

二 代码

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. // 基本数据类型演示反射
  7. func reflectTest01(b interface{}) {
  8. // 通过反射获取传入的变量的 type 和 kind 的值。
  9. // 先获取到 reflect.Type
  10. rTyp := reflect.TypeOf(b)
  11. fmt.Println("rType=", rTyp)
  12. // 获取到 reflect.Value
  13. rVal := reflect.ValueOf(b)
  14. n2 := 2 + rVal.Int()
  15. // n3 := rVal.Float()
  16. fmt.Println("n2=", n2)
  17. // fmt.Println("n3=", n3)
  18. fmt.Printf("rVal=%v rVal type=%T\n", rVal, rVal)
  19. // 将 rVal 转成 interface{}
  20. iV := rVal.Interface()
  21. // 将 interface{} 通过断言转成需要的类型
  22. num2 := iV.(int)
  23. fmt.Println("num2=", num2)
  24. // 获取变量对应的 Kind
  25. rkind := rVal.Kind()
  26. fmt.Println("kind=", rkind)
  27. }
  28. // 结构体演示反射
  29. func reflectTest02(b interface{}) {
  30. // 通过反射获取传入的变量的 type 和 kind 的值。
  31. // 先获取到 reflect.Type
  32. rTyp := reflect.TypeOf(b)
  33. fmt.Println("rType=", rTyp)
  34. // 获取到 reflect.Value
  35. rVal := reflect.ValueOf(b)
  36. // 获取变量对应的 Kind
  37. kind1 := rVal.Kind() // reflect.Value 的 Kind()
  38. kind2 := rTyp.Kind() // reflect.Type 的 Kind()
  39. fmt.Printf("kind =%v kind=%v\n", kind1, kind2)
  40. // 将 rVal 转成 interface{}
  41. iV := rVal.Interface()
  42. fmt.Printf("iv=%v iv type=%T \n", iV, iV)
  43. // 将 interface{} 通过断言转成需要的类型
  44. // 简单使用带检测的类型的断言。
  45. // 使用 swtich 的断言形式做得更加灵活
  46. stu, ok := iV.(Student)
  47. if ok {
  48. fmt.Printf("stu.Name=%v\n", stu.Name)
  49. }
  50. }
  51. type Student struct {
  52. Name string
  53. Age int
  54. }
  55. func main() {
  56. // 先定义一个int
  57. var num int = 100
  58. reflectTest01(num)
  59. fmt.Println("--------------------------------------------------------------------")
  60. // 定义一个 Student 的实例
  61. stu := Student{
  62. Name: "tom",
  63. Age: 20,
  64. }
  65. reflectTest02(stu)
  66. }

三 测试

rType= int

n2= 102

rVal=100 rVal type=reflect.Value

num2= 100

kind= int

-—————————————————————————————————-

rType= main.Student

kind =struct kind=struct

iv={tom 20} iv type=main.Student

stu.Name=tom

发表评论

表情:
评论列表 (有 0 条评论,403人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用

    概述     JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态

    相关 Java深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的