【问题标题】:How to create instance of a class that extends interface?如何创建扩展接口的类的实例?
【发布时间】:2014-01-21 22:12:48
【问题描述】:

我有这样的方法:

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

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

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

如何解决这个问题?

【问题讨论】:

  • 您确定 IMyInterface 在您的类路径中吗?通常 NoClassDefFoundError 是由于类路径问题而引发的运行时错误。
  • 你能在没有反射的情况下创建你的类的实例吗? NoClassDefFoundError 通常发生在您的代码所依赖的类在编译时出现在类路径中,但在执行代码时不在类路径中。
  • 您能否显示其余代码的 sn-ps。例如,IMyInterface?
  • @Jason 但在泛型范围内,您将extends 用于接口和类。
  • 类不能扩展接口!!在这里你可以看到非常好的接口解释和示例 --> tutorialspoint.com/java/java_interfaces.htm

标签: java class reflection interface instance


【解决方案1】:

我测试了您的代码并且它工作正常。但我也能够重现您的问题。

假设,你正在打电话

factoryMethod(MyClass.class);

然后,如果类“MyClass”在其 OWN 类文件中,则只需提供即可正常工作

concreteClass.newInstance();

当类的实现作为内部类类型时,Class not found 异常被抛出。

原因是,inner class实际上是一种嵌套类,因此只有在使用enclosure Class时才能创建实例,还。

在下面给出的示例中,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;    
    }
}

【讨论】:

  • 感谢调查,但 MyClass 不是内部类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多