在Java中创建动态给定类的实例

时间:2017-03-28 00:22:47

标签: java class dynamic instance

我需要一个函数来在java中创建动态给定类的实例。

我找到了很多样本​​但是在所有样本中,要实例化的类在运行时之前就已知。

有用户定义的类:

class Student { //some code }
class Teacher { //some code }
class Course { //some code }

我需要的是

List<class> MyFunction(<class>) {

  List<class> items = new ArrayList<class>();

  for(int i = 0; i < 5; i++) {

    create_a_new_class_instance;

    items.add(new_created_instance);
  }

  return items;

}

我将如何使用

List<Student> students = MyFunction(Student);
List<Teacher> teachers = MyFunction(Teacher);
List<Course> courses = MyFunction(Course);

希望有人帮忙。

这是我在Stackoverflow中的第一个问题,对由此带来的任何不便表示歉意。

Utku

5 个答案:

答案 0 :(得分:7)

在Java 8中,您可以使用method referencelambda expression来动态创建类的实例,而无需使用反射。

public static <T> List<T> myFunction(Supplier<T> supplier) {
    return Stream.generate(supplier)
                 .limit(5)
                 .collect(Collectors.toList());
}

您可以这样称呼:

List<Student> students = myFunction(Student::new);

如果您不熟悉流,那么必要的等价物是:

public static <T> List<T> myFunction(Supplier<T> supplier) {
    int size = 5;
    List<T> list = new ArrayList<>(size);
    for (int i = 0; i < size; i++) {
        list.add(supplier.get());
    }
    return list;
}

答案 1 :(得分:4)

这应该有用。

/contact

答案 2 :(得分:3)

假设提供给MyFunction的类有一个默认构造函数,一个简单的实现就是

  public static <T> List<T> MyFunction(Class<T> clazz) {
    if (clazz == null) {
      return null;
    }
    T item;
    List<T> items = new ArrayList<T>();
    for (int i = 0; i < 5; i++) {
      try {
        item = clazz.newInstance();
      } catch (Exception e) {
        item = null;
      }
      if (item != null) {
        items.add(item);
      }
    }
    return items;
  }

和上面的方法可以像

一样调用
List<Student> student = MyFunction(Student.class);

为了提高透明度,方法中抛出的异常可以用另一种方式处理(例如,添加到方法签名中)。

答案 3 :(得分:1)

您可以使用反射来执行此操作 您传递的每个类都必须具有默认的无参数构造函数。 对于这个特定的应用程序,您可能需要所有3个类共享一个接口,以便您可以正确地发回列表

public interface Unit {
    //Put any common functionality method stubs here
}

public class Teacher implements Unit {
}
//....etc for the other classes
List<Unit> MyFunction(Class<Unit> clazz) {
    List<Unit> items = new ArrayList<Unit>();

    for(int i = 0; i < 5; i++) {
        items.add(clazz.newInstance());
    }

    return items;
}

当您将列表分配给列表变量时,您必须将其强制转换。

如:

List<Student> students = (List<Student>) MyFunction(Student.class);

答案 4 :(得分:0)

你可以使用这样的模式策略:

////接口 打包策略;

公共接口 IStrategy { public void appliquerStrategy();

}

打包 tpdesignpattern2.strategy;

公共类 StrategyImpl1 实现 IStrategy{

@Override
public void appliquerStrategy() {
    System.out.println("Appliquer la strategy 1");
    
}

}

打包 tpdesignpattern2.strategy;

公共类 StrategyImpl2 实现 IStrategy{

@Override
public void appliquerStrategy() {
    System.out.println("Appliquer la strategy 2");
    
}

}

/////// 上下文类 包 tpdesignpattern2.strategy;

公共类上下文{ /*** * 接口注入 */

private IStrategy iStrategy = new StrategyImpl1() ;

/**
 * @param iStrategy
 */

public void setiStrategy(IStrategy iStrategy) {
    this.iStrategy = iStrategy;
}

public void appliquerStrategy() {
    iStrategy.appliquerStrategy();

}

}

////申请 包 tpdesignpattern2.strategy;

导入 java.util.Scanner;

导入策略.IStrategy;

公共类应用{

public static void main(String[] args)   {
    Context context = new Context();
    
    Scanner scanner = new Scanner(System.in);
    
    while(true) {
        System.out.print("Entrer le nom de la calss : ");
        String nom = "tpdesignpattern2.strategy."+scanner.nextLine();

                tpdesignpattern2.strategy.IStrategy strategy;
                try {
                    strategy = (tpdesignpattern2.strategy.IStrategy) Class.forName(nom).newInstance();
                    context.setiStrategy(strategy);
                    context.appliquerStrategy();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                };                  
        }
}

}