【发布时间】:2014-06-06 02:01:48
【问题描述】:
假设我有一个 Java 接口 Blender.java 和各种实现 Cuisinart.java、Oster.java、Blendtec.java 等。现在我想写一个这样的程序:
public class Blendifier {
// ...
public static void main(String... args) {
Blender blender = new Cuisinart();
blender.blend();
}
}
但是现在如果我想使用Blendtec而不是Cuisinart,我必须打开源代码,更改代码,然后重新编译。
相反,我希望能够在运行程序时指定使用哪个Blender,方法是将我想要的类名写为命令行参数。
但是如何从包含类的 name 的字符串转到构造该类的实际 instance 呢?
【问题讨论】:
-
Reflection。或者您可以使用 DI 框架,例如 Spring 或 Guice。
-
反思是一个巨大的话题,我对此一无所知 - 如果有人能让我更接近如何使用它来解决这个特殊问题,我会很高兴......
-
我现在没有时间写一个完整的答案,但我一直使用反射的方式来做这件事。我的“AuthorizationService”采用
.properties配置文件将权限名称映射到实现类;我的“HtmlRenderer”在配置的包中查看是否有一个类<Something>Renderer用于在输入中找到的任何标签,例如<pre>在输入中找到,它在实例化“HtmlRenderer”时在给定的包中查找类PreRenderer。添加新品牌的搅拌机时,无需修改代码以添加新的case或if。
标签: java interface command-line-arguments classname