按字符串创建接口的对象

时间:2012-01-13 10:06:56

标签: java interface classloader

我有以下界面

package test.test;

public interface IMyInterface {
 public String hello();
}

和实施

package test.test.impl;

public class TestImpl implements IMyInterface {
 public String hello() { return "Hello"; }
}

所以我只有完整的字符串“test.test.impl.TestImpl”。如何加载类并从实现中创建一个对象?

我将使用当前的Classloader,但我不知道创建一个Object。

Class<?> i =  getClass().getClassLoader().loadClass("test.test.impl.TestImpl");
IMyInterface impl = null;

感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

Class.newInstance。但是,这种方法的缺点是它抑制了已检查的异常(并引入了新的与反射相关的异常)并始终没有参数。 或者,您可以使用Class.getConstructor(然后Constructor.newInstance),这样您就可以提供参数,但异常问题仍然存在。

答案 1 :(得分:2)

使用反射:

TestImpl ti  = (TestImpl) Class.forName("test.test.impl.TestImpl").newInstance();

答案 2 :(得分:2)

Use impl = (IMyInterface) i.getConstructor().newInstance();

答案 3 :(得分:1)

Class<?> clazz = ....
Object o = clazz.newInstance();
// o will be a valid instance of you impl class

它会调用默认构造函数(你必须有一个!)。

答案 4 :(得分:0)

IMyInterface impl = null;
Class testImpl = Class.forName("test.test.impl.TestImpl");
if(testImpl != null && IMyInterface.class.isAssignableFrom(testImpl.getClass()) {
    impl = testImpl.getConstructor().newInstance();
}

另外,请检查:1)Using Java Reflection - java.sun.com              2)Java instantiate class from string - Stackoverflow