我可以使用Java反射直接实例化接口吗?

时间:2017-03-11 22:25:33

标签: java reflection

我正在处理承包商的代码。无论出于何种原因,他已经制作了一系列常数"所有接口的文件。它们看起来像这样:

Cannot complete the install because one or more required items could not be found.
Software being installed: Azure HDInsight plugin for Java 1.0.0.201701250103 (com.microsoft.hdinsights.feature.feature.group 1.0.0.201701250103)
  Missing requirement: Azure Common Plugin Library 2.9.5.201701250103 (com.microsoftopentechnologies.wacommon 2.9.5.201701250103) requires 'bundle org.eclipse.jdt.ui 3.10.0' but it could not be found
  Cannot satisfy dependency:
    From: HDInsights 1.0.0.201701250103 (com.microsoft.hdinsights 1.0.0.201701250103)
    To: bundle com.microsoftopentechnologies.wacommon 2.9.5
  Cannot satisfy dependency:
    From: Azure HDInsight plugin for Java 1.0.0.201701250103 (com.microsoft.hdinsights.feature.feature.group 1.0.0.201701250103)
To: com.microsoft.hdinsights [1.0.0.201701250103]

等等。没有未实现/抽象的方法,文件只包含一些任意级别的嵌套类,以及常量的静态最终字符串。我目前无法修改承包商的代码。

我正在编写测试框架,我需要其中一个常量接口的实例。所有这些都遵循上述模式,但我的方法需要支持所有这些模式,而不仅仅是特定的模式。

我尝试使用Reflection实例化接口,如下所示:

interface SomeTypeConsts {
    public static class SomeSubTypeA {
        public static final String CONSTANT_A = "foo";
        public static final String CONSTANT_B = "bar";
    }
    public static class SomeSubTypeB {
        public static final String CONSTANT_A = "baz";
    }
}

但它扔了clazz.newInstance() // where clazz is Class<SomeTypeConsts>

这里的所有问题都说你需要首先实现接口,然后使用该实例。如果我提前知道它是哪个const接口,我可以轻松地java.lang.InstantiationException。但是,当我需要处理的只有SomeTypeConsts consts = new SomeTypeConsts(){};时,我还没有能够弄清楚如何用反射做到这一点。

给定一个接口类引用,没有要覆盖/实现的抽象方法,如何使用反射实例化它的实例?

4 个答案:

答案 0 :(得分:3)

你可以使用接口的JDK代理来做这件事,但这完全没有意义:如果你所做的只是访问静态成员,所有这些都是在没有引用任何有关类型的实际实例的情况下解决的,无论是在编译时(更可取)还是在运行时使用某种方法,如枚举字段和过滤静态字段。

答案 1 :(得分:2)

来自the language spec(强调我的):

  

此类型没有实例变量,通常声明一个或多个抽象方法;否则不相关的类可以通过为其抽象方法提供实现来实现接口。 可能无法直接实例化接口。

而且,来自the Javadoc of Class.newInstance()

  

[throws] InstantiationException - 如果此Class表示抽象类,接口,数组类,基本类型或void;或者如果该类没有无效的构造函数;或者如果实例化由于其他原因而失败。

您无法实例化界面。您只能实例化(非抽象)实现它的类。

答案 2 :(得分:0)

没有。你不能这样做。根据定义,接口不可实例化。

答案 3 :(得分:0)

你需要的是一个模拟对象。不反思