我有以下界面
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;
感谢您的帮助!
答案 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