Java获取一个知道类名的对象的现有列表(动态)

时间:2016-02-28 11:56:45

标签: java list oop reflection

我有一个包含2个不同对象类型列表的类。

List<Student> students;
List<Lecturer> lecturers;

这些中的每一个都有一个返回String的方法。我想从该字符串中找到一些东西,我要创建的方法对于两个列表,类名(学生/讲师),列表名称(学生/讲师)和方法相同名称(studentMethod / lecturerMethod)是唯一不同的名称。

知道className,listName和methodName,我如何获得正确的列表(称为listName),以便我可以从列表中的每个对象调用所需的方法(称为methodName)。

P.S。 :我知道为每个列表创建两个单独的方法会更容易,但我希望我的代码是干的,并且还要了解有关OOP原则的更多信息。

实施例: 如果我想获得学生名单,然后为每个学生调用studentMethod,我应该有这样的事情:

void dryMethod(String className, String listName, String methodName) {
    Class<?> desiredClass = Class.forName(className);
    List<desiredClass> desiredList = getListByName(listName);
    Method desiredMethod = getMethodByName(methodName);
    for(desiredClass object : desiredList){
        manipulateString(object.desiredMethod());
    }
}
dryMethod("Student","students","studentMethod");

有可能吗?

2 个答案:

答案 0 :(得分:1)

创建父抽象类/接口,定义两个类应定义的方法。例如:

public interface Person {
    public void desiredMethod();
}

// Student will have to give an implementation for desiredMethod()
public class Student implements Person

// Lecturer will have to give an implementation for desiredMethod()
public class Lecturer implements Person

然后make dryMethod使用实现Person的类型列表:

void dryMethod(List<? implements Person> myList) {
   // you can use List<Student> and List<Lecturer> as myList
   for (Person person : myList) {
       person.desiredMethod();
   }
}

我建议您阅读有关Polymorphism的一些信息。

编辑:声明列表时,您可以执行以下操作:

List<Student> students;  // only Student class allowed
List<Lecturer> lecturers;  // only Lecturer class allowed
List<Person> students;  // both Student and Lecturer class allowed

答案 1 :(得分:0)

有一件事要问自己,如果你有两个类,两个方法几乎完全相同,那么这两个方法实际上是否具有相同的名称并由同一个接口指定?

即使情况并非如此,您也不必放弃DRY。您可以在常用方法中定义字符串处理逻辑,并使用流运算符mapstudentslecturers转换为String的流:

students.stream().map(Student::studentMethod).forEach(this::commonMethod);
lecturers.stream().map(Lecturer::lecturerMethod).forEach(this::commonMethod);

void commonMethod(String str) { ... }

虽然这比OOP风格更具FP风格。在不同类型上执行泛型操作的一个好的OOP方法是使用Visitor design pattern,但与流相比,这需要编写相当多的样板代码。