这可能吗?我可以根据字符串的值来实现一个或另一个类的对象吗?
我有这样的代码:
public Map<Language, IConverter> converters;
// ...
public IConverter buildConverter(Language lang) {
IConverter converter = new ???(buildMap(lang)); <---- Problem here
converters.put(lang, converter);
}
public Map<Integer, String> buildMap(Language lang) {
// ...
}
其中Language
是包含标识语言的字符串的bean类,IConverter
是由多个(未定义的数量)具体Converter
实现的接口。
我是否需要为每个支持的if
添加Converter
条款?无论如何都要识别哪个字符串属于哪个类,可能带有Map或类似的东西?
我可能会放弃语言课程,因为它有点浅薄,无法看到它的标记。
修改
我最后使用了Jesper的答案,我必须调整我的Language
类来包含完整的语言名称,并连接包名,语言名和“转换器”。
男孩,起初反射很吓人,很多很多例外。
答案 0 :(得分:1)
如果您在字符串中有该类的名称,则可以使用reflection创建它的新实例。例如:
String className = "com.mycompany.SomeConverter";
// Creates an instance of the class by using the no-args constructor
IConverter converter = (IConverter) Class.forName(className).newInstance();
如果要使用带参数的特定构造函数:
// For example, look for a constructor that takes one argument, a String
Constructor constr = Class.forName(className).getConstructor(String.class);
// Create a new instance, passing "Hello" as the argument
IConverter converter = (IConverter) constr.newInstance("Hello");
答案 1 :(得分:0)
可能需要与this非常相似的内容。
答案 2 :(得分:0)
Constructor constr = Class.forName("com.yourpackage.converter" + lang.getYourString()).getConstructor(buildMap_function_returned_class.class);
IConverter converter = (IConverter) constr.newInstance(buildMap(lang));