Go反射实践

package main

import (
	"fmt"
	"reflect"
)

//定义了一个Monster结构体
type Monster struct {
	Name  string  `json:"name"`
	Age   int     `json:"monster_age"`
	Score float32 `json:"成绩"`
	Sex   string
}

//方法,返回两个数的和
func (s Monster) GetSum(n1, n2 int) int {
	return n1 + n2
}
//方法, 接收四个值,给s赋值
func (s Monster) Set(name string, age int, score float32, sex string) {
	s.Name = name
	s.Age = age
	s.Score = score
	s.Sex = sex
}
//方法,显示s的值
func (s Monster) Print() {
	fmt.Println("---start~----")
	fmt.Println(s)
	fmt.Println("---end~----")
}

func TestStruct(a interface{}) {

	//获取reflect.Type 类型
	typ := reflect.TypeOf(a)
	//获取reflect.Value 类型
	val := reflect.ValueOf(a)
	fmt.Println("-->", typ, val) //main.Monster {黄鼠狼精 400 30.8 }
	//获取到a对应的类别
	kd := val.Kind()
	//如果传入的不是struct,就退出
	if kd != reflect.Struct {
		fmt.Println("expect struct")
		return
	}

	//获取到该结构体有几个字段
	num := val.NumField()
	fmt.Printf("struct has %d fields\n", num) //4

	//变量结构体的所有字段
	for i := 0; i < num; i++ {
		fmt.Printf("Field %d: 值为=%v\n", i, val.Field(i))
		//获取到struct标签, 注意需要通过reflect.Type来获取tag标签的值
		tagVal := typ.Field(i).Tag.Get("json")
		//如果该字段有tag标签就显示,否则就不显示
		if tagVal != "" {
			fmt.Printf("Field %d: tag为=%v\n", i, tagVal)
		}
	}

	//获取到该结构体有多少个方法
	numOfMethod := val.NumMethod()
	fmt.Printf("struct has %d methods\n", numOfMethod) //3

	//var params []reflect.Value
	//方法的排序默认是按照 函数名的排序(ASCII码)
	val.Method(1).Call(nil) //获取到第二个方法。调用它

	//调用结构体的第1个方法Method(0)
	var params []reflect.Value //声明了 []reflect.Value
	params = append(params, reflect.ValueOf(10))
	params = append(params, reflect.ValueOf(40))
	res := val.Method(0).Call(params) //传入的参数是 []reflect.Value, 返回[]reflect.Value
	fmt.Println("res=", res[0].Int()) //返回结果, 返回的结果是 []reflect.Value*/

}
func main() {
	//创建了一个Monster实例
	var a Monster = Monster{
		Name:  "黄鼠狼精",
		Age:   400,
		Score: 30.8,
	}
	//将Monster实例传递给TestStruct函数
	TestStruct(a)
}

原文地址:https://www.cnblogs.com/yzg-14/p/12237320.html

时间: 2024-10-04 03:08:45

Go反射实践的相关文章

反射实践积累

背景 在一个服务实现内,有很多结构相似,略微不同的函数. Martin大师的谆谆告诫我们,可以使用Extract Method的方式进行重构. 本次练习的内容主要是使用反射. 以零散知识点的形式记录每一天的工作. 内容 1. 获取Type 一般有两种方式获取类型: 1.1 typeof方式 var entityType = typeof(T); typeof(DataRow); 1.2 Type.GetType()方法 var daoType = dao.GetType(); 2.构造函数Con

JAVA反射实践

Java反射机制在我的理解当中就是下面几点: 1. 对一个给定的类名(以字符串形式提供)能动态构建一个对象实例 2. 对于任意一个类,都能够知道这个类的所有属性和方法 3. 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制,这种反射机制在Java当中给我们带来了极大的方便,被大量地应用于JavaBean中 在Java的反射中我们主要用到以下几个类,下面将逐个说明 java.lang.Class; java.lang.r

java 反射实践

/** * * @author yuxg */ import coreJava.javaFile; import javaClassStudy.Student; import javaClassStudy.Person; public class helloWorld { public static void main(String[] parm){ //reflection //实例一个学生对象 Person p = new Student("yuxg",12); //获取对象的类

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践

JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识Class类 想要反射,你就必须要了解一个类--Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物: 我们归根结底就

java 反射(reflect)总结,附对象打印工具类

java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制Reflection. 这就说明:Java程序可以加载一个编译期间完全未知的class,获悉其完整构造,并生成其对象实体.或对其fields设值.或唤起其methods.虽然java并不是动态语言. 如何达到上述目的,是本文探讨的内容.本文将介绍Reflection A

JVM(四),什么是反射

四.什么是反射 1.反射理论 2.反射实践 (1)创建Robot类 public class Robot { private String name; public void sayHi(String helloSentence){ System.out.println(helloSentence + " " + name); } private String throwHello(String tag){ return "Hello " + tag; } stat

Java 反射最佳实践 – 码农网

参考自 http://www.cnblogs.com/tianzhijiexian/p/3906774.htmlhttps://github.com/tianzhijiexian/HttpAnnotation/blob/master/lib/src/main/java/kale/net/http/util/HttpReqAdapter.java 原网页地址:http://www.codeceo.com/article/java-reflector.html... 概要:最简单优雅的使用反射. 本

java反射的应用实践

java反射之前接触比较多,但仅技术方面思考的多:这次主要是从业务角度出发,思考java反射在业务模块设计中如何发挥更高效的作用,以提高生产率. 1.业务需求 要处理银行回单票据,提取出付款人.收款人及对应银行和业务信息,每个银行的格式都不统一.所以需要对各家银行的格式进行预处理,规整为标准格式后,交由后续模块处理. 这个预处理格式化的设计有多种 2.方案选型 做法 适用场景 技能要求 在if..else中添加分支逻辑 适用于分支较少的场景,如只有2~4个 简单 把分支逻辑提取为句柄,显示注册到

java反射基础知识(四)反射应用实践

反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类. 通过getClass方法 在Java中,每一个Object都有一个getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类: 1 2 String s = "ziwenxie"; Class