有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个类,包含两个不同对象类型的列表

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

每个类都有一个返回字符串的方法。我想从这个字符串中找到一些东西,我将为两个列表创建相同的方法,只有类名(学生/讲师)、列表名(学生/讲师)和方法名(学生方法/讲师方法)不同

知道类名、listName和methodName之后,我如何才能获得正确的列表(称为listName),这样我就可以从列表中的每个对象调用所需的方法(称为methodName)

附言:我知道为每个列表创建两个单独的方法会更容易,但我希望我的代码是干巴巴的,同时也希望了解更多关于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) 个答案

  1. # 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
    

    然后让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
    
  2. # 2 楼答案

    要问自己的一件事是,如果你有两个类和两个方法,它们做的事情几乎相同,那么这两个方法实际上应该有相同的名称,并且由相同的接口指定吗

    即使不是这样,你也不必放弃干货。您可以用一种常用方法定义字符串处理逻辑,并使用流运算符mapstudentslecturers转换为String的流:

    students.stream().map(Student::studentMethod).forEach(this::commonMethod);
    lecturers.stream().map(Lecturer::lecturerMethod).forEach(this::commonMethod);
    
    void commonMethod(String str) { ... }
    

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