在java中使用泛型类型创建实例而不是反射
我有如下代码:在java中使用泛型类型创建实例而不是反射,java,reflection,factory-pattern,Java,Reflection,Factory Pattern,我有如下代码: public class Person{ private Configuration configuration; public void act(){ final Action action = new Factory().createAction(configuration); .... } } public class Factory{ public Action createAction(Configura
public class Person{
private Configuration configuration;
public void act(){
final Action action = new Factory().createAction(configuration);
....
}
}
public class Factory{
public Action createAction(Configuration configuration){
Constructor<? extends Action> constructor =
configuration.getActionClass.
getConstructor(configuration.getClass());
return constructor.newInstance(configuration);
}
}
public class Configuration{
private Class<? extends Action> actionClass;
public void setActionClass(Class<? extend Action> cls){
this.actionClass = cls;
}
public Class<? extends Action> getActionClass(){
return this.actionClass;
}
}
公共类人物{
私有配置;
公共无效法{
最终动作动作=新建工厂().createAction(配置);
....
}
}
公营工厂{
公共操作createAction(配置){
构造函数由于类型擦除(请参阅),如果要在运行时实例化类型,则无法避免反射和类
参数,因此要回答您的问题,这可能有点过分,但new t();
根本不可能
但是,通过向配置
类添加泛型类型参数,可以使其类型安全
public class Configuration<T extends Action> {
private Class<T> actionClass;
public void setActionClass(Class<T> cls){
this.actionClass = cls;
}
public Class<T> getActionClass(){
return this.actionClass;
}
}
公共类配置{
私人类;
公共无效setActionClass(类别cls){
this.actionClass=cls;
}
公共类getActionClass(){
返回此.actionClass;
}
}
并去掉对它的任何原始引用。(即,将Configuration
切换到Configuration
,无论它在哪里使用)我从一位朋友那里得到了一个非常简洁的解决方案,使用了Java 8的新功能特性
public class Person{
private Configuration configuration;
public void act(){
final Action action = configuration.getActionFactory().apply(configuration);
....
}
}
public class Configuration{
private Function<Configuration, Action> actionFactory = Action::new;
public void setActionFactory(Function<Configuration, Action> actionFactory){
this.actionFactory = actionFactory;
}
public Function<Configuration, Action> actionFactory getActionFactory(){
return this.actionFactory;
}
}
公共类人物{
私有配置;
公共无效法{
最终操作Action=configuration.getActionFactory().apply(配置);
....
}
}
公共类配置{
私有函数actionFactory=Action::new;
公共无效setActionFactory(函数actionFactory){
this.actionFactory=actionFactory;
}
公共函数actionFactory getActionFactory(){
把这个退回工厂;
}
}
如果向配置中添加某种类型(即配置
和类操作类
),则此类型可能会变为类型安全。另请参见此类型也需要更改公共操作createAction(配置配置)
为公共T createAction(配置配置)
,因此它返回参数类型,而不仅仅是操作
。我的目的不是在运行时更改操作,而是在操作
@bresai的固定子类中更改此解决方案就可以了。@biziclop当然,这是一个很好的解决方案。但是既然不需要在运行时更改操作,为什么我不能摆脱反射?@bresai是因为这就是Java中实现类型参数的方式。这是一个已知的和计划中的缺陷,在新功能和与前泛型代码的兼容性之间提供了一个很好的折衷。