使用Java反射实例化接口?

时间:2020-03-10 20:49:10

标签: java reflection

是否可以仅使用Java反射实例化接口? 我想有一个工厂方法-仅通过了解其类即可生成接口。

public interface IReflection {

    public default String say(){
        return  "test default";
    }

}


public <T> T factoryProduce(Class<T> type){
    // how to instantiate on factoryProduce(IReflection.class)
}

我正在尝试使用反射模拟以下内容。 因为以下原因,我无法动态获取接口类

return new IReflection(){}

使用newInstance()失败,原因是接口中没有构造函数。

Constructor<?>[] con = IReflection.class.getDeclaredConstructors(); // empty
i = IReflection.class.newInstance();    // no constructor
i = IReflection.class.getDeclaredConstructor().newInstance(); // no constructor

3 个答案:

答案 0 :(得分:3)

接口没有构造函数。他们没有隐式或显式地参与构造函数链,而是从最派生的类向java.lang.Object调用super。

我建议避免反射,但是如果您出于某些原因绝对必须这样做,则可以使用java.lang.reflect.Proxy。不幸的是,它确实代理了默认方法。 this answer是一个肮脏的地方,或者编写类加载器来加载简单的子类型。

答案 1 :(得分:1)

无法实例化接口,即使使用反射也不能实例化(即使其所有方法都具有默认实现也不能实例化)。您只能实例化实现该接口的类。

如果您需要factoryProduce支持的接口数量很少,则可以简单地为每个接口创建一个实现类,并创建从接口类型到实现类的映射。 factoryProduce然后可以从此映射中获取实现类,并使用反射对其进行实例化。

如果您确实需要一个完全动态的解决方案,请查看dynamic proxies,它能够在运行时创建实现给定接口集的类。

答案 2 :(得分:0)

您当然不能实例化该接口,但可以实例化定义该接口的Class对象。

可以使用从String获得的javax.tools.JavaCompiler,从包含定义的ToolProvider.getSystemJavaCompiler()即时编译接口,然后使用java.lang.ClassLoader.defineClass()定义上课。

PS:我在Obba(电子表格的对象处理程序)中使用了这种技术(有一个示例在运行时从包含代码的String创建一个类)。