Java 如何创建一个";动态(在运行时决定)“;上课?

Java 如何创建一个";动态(在运行时决定)“;上课?,java,generics,Java,Generics,我有几个类,比如MyClassA、MyClassB、MyClassC和MyClassD 我想要一个给定类类型的函数,该函数将创建(并执行任何操作…)一个作为类实例的对象 所以我的函数是这样的 public void foo(ClassType MyChoosenClassType){ MyChoosenClassType x=new MyChoosenClassType(); //do whatever with x } 我有办法做到这一点吗 或者我必须使用if条件

我有几个类,比如MyClassA、MyClassB、MyClassC和MyClassD

我想要一个给定类类型的函数,该函数将创建(并执行任何操作…)一个作为类实例的对象

所以我的函数是这样的

public void foo(ClassType MyChoosenClassType){
       MyChoosenClassType x=new MyChoosenClassType();
       //do whatever with x
}
我有办法做到这一点吗


或者我必须使用if条件和我自己的方式手动执行所有操作吗?

您可以使用Java反射API,通过使用和方法执行:

然后,您可以实现
foo
方法,如下所示:

public void foo(String classType) {
    Supplier<? extends MyClassParent> factory = factories.get(classType);
    if (factory != null) {
        MyClassParent instance = factory.get();

        // work with instance
    }
}
公共void foo(字符串类类型){

供应商我不确定是否有办法做到我在问题中确切提到的内容;但是这是我最终提出的解决方案。不像我在问题示例代码中提到的那样简单和直接。 正如Jimmy T.提到的

public void foo(Object anyObjectOfTypeMyClass){
       Object x=anyObjectOfTypeMyClass.getClass().newInstance();
       //do anything with x
}

这些类共享一个公共接口吗?不,但是它们是从同一个类扩展而来的,比如说MyClassParents这些类的构造函数是什么?不管怎样,下面是创建实例的方法:你可以做工厂的事情(并避免反射)在Java的早期版本中也是如此;如果没有
::新的
lambda表达式,它就不那么简洁了。我仍然想知道是否有一种方法可以像我的示例代码中那样优雅和直接。这不能用或gererics来完成吗?反射有那么糟糕吗?@SadeepDarshana不,没有那么糟糕,尤其是在Java8中高度改进。@Wyzard同意,您可以在Java7中使用匿名内部类。但这让代码看起来很难看。。。
public void foo(String classType) {
    Supplier<? extends MyClassParent> factory = factories.get(classType);
    if (factory != null) {
        MyClassParent instance = factory.get();

        // work with instance
    }
}
public void foo(Object anyObjectOfTypeMyClass){
       Object x=anyObjectOfTypeMyClass.getClass().newInstance();
       //do anything with x
}