我有这样的方法:
public IMyInterface factoryMethod(Class<? extends IMyInterface> concreteClass){
IMyInterface o = concreteClass.newInstance();
//...some stuff
return o;
}
如果调用方法,我会得到异常:java.lang.NoClassDefFoundError: packages/IMyInterface
似乎它试图找到类IMyInterface
然后找到它的构造函数。当然它失败了。
如何修复此方法?
答案 0 :(得分:1)
我测试了你的代码并且它的工作正常。但我也能够重现你的问题。
假设您正在致电
factoryMethod(MyClass.class);
然后,如果“MyClass”类在其 OWN类文件中,则只需提供
即可正常工作concreteClass.newInstance();
将类的实现作为内部类类型时,会抛出 Class not found exception 。
原因是,内部类实际上是嵌套类的一种类型,因此在使用封闭类时,只能创建实例,也。
在下面给出的示例中,newInstance()
方法已与内部类一起使用。
public class Test {
public class MyClass implements MyInterface {
}
public interface MyInterface {
}
public static void main(String[] args){
MyInterface ret = method(MyClass.class);
if (ret instanceof MyClass){
System.out.println("Is MyClass");
}
}
public static MyInterface method(Class<? extends MyInterface> actualClass){
try {
Class<?> enclosingClass = Class.forName(actualClass.getDeclaringClass().getCanonicalName());
Object enclosingInstance = enclosingClass.newInstance();
Class<?> innerClass = Class.forName(actualClass.getName());
Constructor<?> constructor = innerClass.getDeclaredConstructor(enclosingClass);
Object innerInstance = constructor.newInstance(enclosingInstance);
return (MyInterface) innerInstance;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}