如何创建扩展接口的类的实例?

时间:2014-01-21 22:12:48

标签: java class reflection interface instance

我有这样的方法:

public IMyInterface factoryMethod(Class<? extends IMyInterface> concreteClass){
    IMyInterface o = concreteClass.newInstance();
    //...some stuff
    return o;
}

如果调用方法,我会得到异常:java.lang.NoClassDefFoundError: packages/IMyInterface

似乎它试图找到类IMyInterface然后找到它的构造函数。当然它失败了。

如何修复此方法?

1 个答案:

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