是否可以仅使用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
答案 0 :(得分:3)
接口没有构造函数。他们没有隐式或显式地参与构造函数链,而是从最派生的类向java.lang.Object
调用super。
我建议避免反射,但是如果您出于某些原因绝对必须这样做,则可以使用java.lang.reflect.Proxy
。不幸的是,它确实代理了默认方法。 this answer是一个肮脏的地方,或者编写类加载器来加载简单的子类型。
答案 1 :(得分:1)
无法实例化接口,即使使用反射也不能实例化(即使其所有方法都具有默认实现也不能实例化)。您只能实例化实现该接口的类。
如果您需要factoryProduce
支持的接口数量很少,则可以简单地为每个接口创建一个实现类,并创建从接口类型到实现类的映射。 factoryProduce
然后可以从此映射中获取实现类,并使用反射对其进行实例化。
如果您确实需要一个完全动态的解决方案,请查看dynamic proxies,它能够在运行时创建实现给定接口集的类。
答案 2 :(得分:0)