Java:按名称实例化具体的impl

时间:2012-04-30 18:19:47

标签: java generics reflection dependency-injection

如果我有一个名为Widget的类,那么我可以使用以下代码(或多或少)创建一个新类:

Class<?> widgetClass = Class.forName("Widget");
Widget widget = (Widget)widgetClass.newInstance();

但是如果我有一个接口Fruit和几个具体的实现(例如AppleOrangeKiwi)怎么办?如果我尝试:

Class<?> fruitClass = Class.forName("Apple");
Fruit fruit = (Fruit)fruitClass.newInstance();

我收到错误:

  

水果无法解析为某种类型。

如果我像这样删除显式转换:

Fruit fruit = fruitClass.newInstance();

我得到了一个不同的错误:

  

类型不匹配:无法从捕获#2转换?果实。

那么如何使用String来实例化我想要的Fruit具体结果

3 个答案:

答案 0 :(得分:2)

您可能只是忘记导入Fruit界面:

import com.foo.bar.Fruit;

注意:从不使用默认包。始终将您的课程放在一个包中。

其他注意:如果类的名称不是从某些外部资源(文件,数据库等)动态读取的,但是如您的问题所示是硬编码的,则应该只调用其构造函数:

Fruit f = new Apple();

答案 1 :(得分:2)

错误消息“Fruit无法解析为某种类型”意味着您的导入/构建路径设置不正确。

否则,您的代码看起来是正确的。

答案 2 :(得分:1)

您的代码没有任何问题。但是,您的Fruit类不在编译类路径中,因此编译器错误。