1

这可能吗?我可以根据字符串的值从一个类或另一个类中实例化一个对象吗?

我有这样的代码:

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) {
    // ...
}

whereLanguage是一个包含标识语言的字符串的 bean 类,并且IConverter是由几个(未定义数量)具体实现的接口Converter

我需要为if每个支持添加一个子句Converter吗?有没有办法确定哪个字符串属于哪个类,可能是使用 Map 或类似的东西?

我可能会放弃 Language 课程,因为它有点肤浅,看不到它的扩展。

编辑

我结束了使用 Jesper 的答案,我不得不调整我的Language课程以使其包含完整的语言名称,并将包名称、语言名称和“转换器”连接起来。

男孩,一开始反射很可怕,有很多很多的例外。

4

3 回答 3

1

如果您在字符串中有类的名称,则可以使用反射创建它的新实例。例如:

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");
于 2013-10-31T13:47:53.417 回答
0

我猜你的意思是这个

Constructor constr = Class.forName("com.yourpackage.converter" + lang.getYourString()).getConstructor(buildMap_function_returned_class.class);

IConverter converter = (IConverter) constr.newInstance(buildMap(lang));
于 2013-10-31T13:51:50.867 回答
0

可能您需要与非常相似的东西。

于 2013-10-31T13:47:54.953 回答