我需要一个函数来在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
答案 0 :(得分:7)
在Java 8中,您可以使用method reference或lambda 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();
};
}
}
}