Go - reflection

Go 语言也有反射的机制,通过这种机制可以大大提高程序的灵活性。

reflect包中的 TypeOf 与 ValueOf 方法

首先,当我们想要使用反射技术的时候,我们需要先引用 reflect 包。

import (
    "fmt"
    "reflect"
)

之后,我们就可以通过reflect包中的TypeOf方法来取到类型,并且使用ValueOf方法来获取字段及方法。我们来看一个实例

// reflect.go
package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string
    Age  int
    Sex  string
}

func (u User) SayHello() {
    fmt.Println("Hello there, I am %s ...", u.Name)
}

func main() {
    user := User{
        "Tony",
        30,
        "male"}
    info(user)
}

func info(o interface{}) {
    t := reflect.TypeOf(o)
    fmt.Printf("Type is: %s \n", t.Name())

    fmt.Printf("Fields are: \n")

    // find out fileds
    v := reflect.ValueOf(o)

    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        val := v.Field(i).Interface()
        fmt.Printf("%6s: %v=%v\n", f.Name, f.Type, val)
    }

    // find out methods
    for i := 0; i < t.NumMethod(); i++ {
        m := t.Method(i)
        fmt.Printf("%6s: %v\n", m.Name, m.Type)
    }
}

output:

使用反射修改类型

如果我们需要通过反射的方式来修改类型的字段,那么传入给ValueOf()方法的参数应该是对象的引用。

// reflect1.go
package main

import (
    "fmt"
    "reflect"
)

type People struct {
    Name string
    Age  int
}

func main() {
    p := People{"Tony", 30}
    fmt.Printf("my name is: %s\n", p.Name)

    val := reflect.ValueOf(&p)
    f := val.Elem().FieldByName("Name")
    f.SetString("Tom")

    fmt.Printf("my name is: %s\n", p.Name)
}

使用反射来“动态”调用方法

// reflect1.go
package main

import (
    "fmt"
    "reflect"
)

type People struct {
    Name string
    Age  int
}

func (p People) Hello(name string) {
    fmt.Printf("Hello there, I am %s", name)
}

func main() {
    p := People{"Tony", 30}
    v := reflect.ValueOf(p)
    mv := v.MethodByName("Hello")

    args := []reflect.Value{reflect.ValueOf("Tom")}
    mv.Call(args)
}

需要注意的是,通过反射调用方法的时候需要以slice的形式传入参数,

 args := []reflect.Value{reflect.ValueOf("Tom")}

 最后使用method.call来调用方法
 mv.Call(args)
时间: 2024-10-29 07:46:26

Go - reflection的相关文章

C#反射Reflection

反射就是动态获取程序集中的元数据,直接通过.dll来创建对象,调用成员. Type是反射一个重要的类.通过Type获取类中所有信息,包括方法,属性等. 一.Type的简单使用 1.通过typeof(类型名)或类实例.GetType()的方式获取某个类型的Type. 2.通过GetFields方法可以获取类型中的所有属性. 3.Activator.CreateInstance(类型的Type)可以创建类型的实例. 4.IsInstanceOfType(),判断是否是某一类型的的实例. 5.IsAs

Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro

1.错误描写叙述 信息: MLog clients using java 1.4+ standard logging. 2014-7-12 19:29:20 com.mchange.v2.c3p0.C3P0Registry banner 信息: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10] 2014-7-12 19:29:21 org.springframework.w

参数计数不匹配,未处理System.Reflection.TargetParameterCountException

系统出现异常:参数计数不匹配,未处理System.Reflection.TargetParameterCountException, 系统会显示如下的异常信息,但异常信息往往与实际异常位置差十万八千量: 未处理 System.Reflection.TargetParameterCountException Message=参数计数不匹配. Source=mscorlib StackTrace: 在 System.Reflection.RuntimeMethodInfo.Invoke(Object

Java Reflection 相关及示例

Java Reflection 相关及示例 前言: 代码有点长.贴出github地址:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-java-reflection 测试目标类:TargetClass.自定义的辅助类比较多.在这里不贴了.篇幅有限.并且测试也简单.因此测试类也没有提及. 一:简介 Java Reflection是针对Class也就是我们平常说的类而言的.用于操作Java中的Class.在Ja

GO语言method、interface、reflection、select

方法method -GO方法虽没有class,依旧有method -通过显示说明receiver来实现与某个类型的组合 -只能为同一个包中的类型定义方法 -RECEIVER可以是类型的值或指针 -不存在方法重载 -可以使用值或指针来调用方法,编译器会自动完成转换 -从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数 -如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法 -类型别名不会拥有底层类型所附带的方法 -方法可以调用结构中的非公开字段 接口i

代理(Proxy)和反射(Reflection)

前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层JS引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象.本文将详细介绍代

Java Reflection 概述

Reflection 被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 反射类:java.lang.Class 是反射的源头,下面以 Java 程序运行过程来说明清楚: 我们写代码新建的一个类,通过编译(javac.exe)生成了字节码文件(.class),再用 java.exe 加载该字节码文件到内存(使用的是 JVM 的类装载器)之后,内存缓存中的这一块区域就是这个运行时类所对应的 Class 类的

Java反射机制(Reflection)

Java反射机制(Reflection) 一.反射机制是什么 Java反射机制是程序在运行过程中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性,这种动态获取类信息以及动态调用对象方法的功能就是JAVA语言的反射机制. 二.反射机制能干什么 (1)在运行时判断任意一个对象所属的类 (2)在运行时构造任意一个类的对象 (3)在运行时判断任意一个类所具有的成员变量和方法 (4)在运行时调用任意一个对象的方法 (PS:注意反射机制都是在程序运行时,而不

反射(Reflection)

反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息并进行对象的创建及方法的调用: 测试类: class HI { public string Hi = "HelloWorld"; public string SayHello_CI() { return "Hello World!"; } public string S

Dynamic Programming——Reflection and Generic Types

From the point of view of reflection, the difference between a generic type and an ordinary type is that a generic type has associated with it a set of type parameters (if it is a generic type definition) or type arguments (if it is a constructed typ