编程基础知识之反射
2015-11-22 13:58
211 查看
反射(reflection)是在Java语言出现后迅速流行起来的一种概念。通过反射,你可以获取对象类型的详细信息,并可动态操作对象。反射是把双刃剑,功能强大但代码可读性并不理想。若非必要,我们并不推荐使用反射。
Go语言的反射实现了反射的大部分功能,但没有像Java语言那样内置类型工厂,故而无法做到像Java那样通过类型字符串创建对象实例。在Java中,你可以读取配置并根据类型名称创建对应的类型,这是一种常见的编程手法,但在Go语言中这并不被推荐。
反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。
这里先举一个小例子,可以利用反射功能列出某个类型中所有成员变量的值,如代码清单1-2所示。
代码清单1-2 reflect.go
package main
import (
"fmt"
"reflect" )
type Bird struct {Name string
LifeExpectance int}
func (b *Bird) Fly() {
fmt.Println("I am flying...") } func main() {
sparrow := &Bird{"Sparrow", 3}
s := reflect.ValueOf(sparrow).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(),
f.Interface())
}
}
该程序的输出结果为:
0: Name string = Sparrow 1: LifeExpectance int = 3
我们会在第9章中简要介绍反射的基本使用方法和注意事项。
Go语言的反射实现了反射的大部分功能,但没有像Java语言那样内置类型工厂,故而无法做到像Java那样通过类型字符串创建对象实例。在Java中,你可以读取配置并根据类型名称创建对应的类型,这是一种常见的编程手法,但在Go语言中这并不被推荐。
反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。
这里先举一个小例子,可以利用反射功能列出某个类型中所有成员变量的值,如代码清单1-2所示。
代码清单1-2 reflect.go
package main
import (
"fmt"
"reflect" )
type Bird struct {Name string
LifeExpectance int}
func (b *Bird) Fly() {
fmt.Println("I am flying...") } func main() {
sparrow := &Bird{"Sparrow", 3}
s := reflect.ValueOf(sparrow).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(),
f.Interface())
}
}
该程序的输出结果为:
0: Name string = Sparrow 1: LifeExpectance int = 3
我们会在第9章中简要介绍反射的基本使用方法和注意事项。
相关文章推荐
- python的编码问题研究------使用scrapy体验
- java对象序列化
- 面向对象包的设计原则ADP/SDP/SAP与包的设计度量工具jDepend
- ElasticSearch里JAVA环境丢失的问题
- PHP - 类库
- C++IO流简介
- annotation-config 和 component-scan 的区别
- C++IO流简介
- 图学java基础篇之并发
- 图学java基础篇之并发
- springMVC配置文件
- C++指针和引用的区别
- ubuntu eclipse 不能新建javaweb项目解决方案
- 【C++】中序线索化二叉树及其遍历
- 注册asp.net 4.0 到iis
- 在Ubuntu 14.04中安装最新版Eclipse
- [Python]利用python爬虫去LeetCode上下载Ac解
- java线程内存可见性-java内存模型
- Ubuntu14.04下jdk的安装
- 11月TIOBE编程语言排行榜,OC已经掉出前十