我正在处理承包商的代码。无论出于何种原因,他已经制作了一系列常数"所有接口的文件。它们看起来像这样:
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(){};
时,我还没有能够弄清楚如何用反射做到这一点。
给定一个接口类引用,没有要覆盖/实现的抽象方法,如何使用反射实例化它的实例?
答案 0 :(得分:3)
你可以使用接口的JDK代理来做这件事,但这完全没有意义:如果你所做的只是访问静态成员,所有这些都是在没有引用任何有关类型的实际实例的情况下解决的,无论是在编译时(更可取)还是在运行时使用某种方法,如枚举字段和过滤静态字段。
答案 1 :(得分:2)
来自the language spec(强调我的):
此类型没有实例变量,通常声明一个或多个抽象方法;否则不相关的类可以通过为其抽象方法提供实现来实现接口。 可能无法直接实例化接口。
而且,来自the Javadoc of Class.newInstance()
:
[throws]
InstantiationException
- 如果此Class表示抽象类,接口,数组类,基本类型或void;或者如果该类没有无效的构造函数;或者如果实例化由于其他原因而失败。
您无法实例化界面。您只能实例化(非抽象)实现它的类。
答案 2 :(得分:0)
没有。你不能这样做。根据定义,接口不可实例化。
答案 3 :(得分:0)
你需要的是一个模拟对象。不反思