根据字符串的值从类A ... Z(可伸缩)创建对象

时间:2013-10-31 13:35:38

标签: java reflection

这可能吗?我可以根据字符串的值来实现一个或另一个类的对象吗?

我有这样的代码:

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类来包含完整的语言名称,并连接包名,语言名和“转换器”。

男孩,起初反射很吓人,很多很多例外。

3 个答案:

答案 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));