谁能告诉我如何从字符串创建Type的新实例?反映?
有示例,但它们适用于语言[:(]的旧版本(Go 1之前的版本)
因此,如果我正确理解了您的问题,那么您在问的是,仅将类型名称作为字符串时,如何创建对象。因此,例如,您可能有一个字符串“
MyStruct”,并且想要创建这种类型的对象。
不幸的是,这是不容易实现的,因为Go是一种静态类型的语言,并且链接程序将消除无效代码(或其中的内联部分)。因此,不能保证最终的可执行文件甚至将包含“
MyStruct”代码。
但是,您可以map[string]reflect.Type
手动维护全局变量。例如,通过在init()
定义此类可发现类型的软件包功能中初始化此映射。这还将告诉编译器您正在使用这些类型。然后,您可以使用此映射查找要创建的类型的reflect.Type,并使用reflect.New获取指向该类型新对象的指针(存储为reflect.Value)。您可以使用以下方法将对象提取到接口中:
reflect.New(yourtype).Elem().Interface()
Elem()将取消引用指针,而Interface()将以形式返回反射值interface{}
。有关更多详细信息,请参见反射定律。
PS:也许有一种更好的方法来构建程序,甚至不需要反射,也可以让编译器捕获更多错误。您是否考虑过使用工厂方法?另一种简单的解决方案可能是维护map[string]func() interface{}
可以调用的函数以创建具有该名称的新对象。
问题内容: 我的问题是这样的: 为什么不能使用类Class的new T()和newInstance()实例化泛型? 问题答案: 您需要使用反射(),因为在编译时需要链接其构造函数的类是未知的。因此,编译器无法生成链接。
英文原文:http://emberjs.com/guides/object-model/reopening-classes-and-instances/ Ember.js的类不需要一次性完成所有的定义。可以通过reopen方法重新打开一个类来定义新的属性。 1 2 3 4 5 Person.reopen({ isPerson: true }); Person.create().get('i
问题内容: 当我尝试运行此代码时: 我收到此错误: 我不明白为什么我无法实例化课程…在我看来似乎是对的… 问题答案: 是一个接口,因此您无法直接实例化它。您可以实例化一个具体的子类,例如:
问题内容: 我想在Java中创建泛型类型的对象。请提出如何实现相同的建议。 注意:这似乎是一个简单的泛型问题。但是我打赌..不是。:) 假设我的类声明为: 问题答案: 你必须添加异常处理。 你必须在运行时传递实际类型,因为它不是编译后字节码的一部分,因此,没有显式提供它就无法知道它。
问题内容: 我有以下代码: 然后工作正常: 但这不是: 引发TypeError。 我发现新型类在__dict__类而不是实例__dict__中寻找魔术方法。这是正确的吗?为什么会这样呢?您是否知道任何文章解释了背后的想法?我尝试过RTFM,但可能不是正确的方法,或者没有抓住问题… 非常感谢你!保罗 问题答案: 这在Python数据模型文档中进行了介绍:新型类的特殊方法查找: 对于新型类,只有在对对
问题内容: 我对Spring不太熟悉,并且遇到以下情况: 存储库类: 使用存储库类的类: 我知道,如果我用注释并与一起使用,则 可以解决。问题是我处于一种需要创建带有反射的新实例的情况下。因此永远不会解决,并且始终为null。 在这种情况下有没有办法使用? 更好地解释我的情况:我有一些实现。在我的应用程序的设置阶段,我将创建以下实现。基本上: 然后,我有了一个泛型,可以 使用 ,上面的内容和反射内