Go:reflect

在Java中编写抽象代码,使用类型本身的信息创建实例。

1
2
3
4
5
6
7
8
9
private <T> T createInstance (Class<T> clazz) {
T obj = null;
try {
obj = (T)(Class.forName(clazz.getName()));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}

Go中的reflect package

首先使用createInstance,创建一个将成为实例化过程主体的函数。代码如下所示:

1
2
3
4
func createInstance(typ reflect.Type) interface{} {
val := reflect.New(typ).Elem()
return val.Interface()
}

该函数的参数是 reflect.Type类型。 即使它是一个类型,如果它是一个interface{}类型,任何东西都会放在参数中,所以reflect.Type类型是绑定的。

使用createInstance()创建的函数的调用的处理如下 :

1
2
3
var u User
obj := createInstance(reflect.TypeOf(u))
r := obj.(User)

可以reflect.TypeOf()通过将声明的变量作为参数reflect.Type来获得类型的对象。将此createInstance()传递给函数。