有没有办法获取一个类的所有成员类并循环它们以执行方法?

问题描述

我有一个 ManagerCLass,其中包括许多其他对象。这是方法,它接受这些对象并在这些对象上调用一个方法.. 示例:

public class Manager extends BaseManager {



ClassA classA = new ClassA();
ClassB classB = new ClassB();
ClassC classC = new ClassC();
ClassD classD = new ClassD();
ClassE classE = new ClassE();


public void callMethodsOnObjects() {
    classA.printResult();
    classB.printResult();
    classC.printResult();
    classD.printResult();
    classE.printResult();
}

}

这些类都具有相同的超类。现在我的问题是,有没有办法自动调用 callMethodsOnObjects() 方法

我的想法是获取 Managerclass 的所有声明类。然后循环数组,在每个对象上执行 printResult() 方法

Class<?>[] classes = Manager.class.getDeclaredClasses();

    for (int i = 0; i < classes.length; i++) {
        ....
    }

但这行不通。数组为空。

那么,如果这是一种自动化的方法,您有什么想法吗? 还有更多的方法是以这种方式构建的。 我哪儿也去不了。像我想象的那样这样做有意义吗?

解决方法

好的,所以这里真正的问题是您错误地使用了 Java 术语。

没有 Manager 类的成员类。是的。这就是我说的!

“成员类”是在另一个类中声明的类。但是在 Manager 中没有声明任何类。

然而,在Manager内声明了字段(“成员字段”);即 classAclassB 等。这些字段有类;即 ClassAClassB 等。

如果要查找类的成员字段,请使用 Class.getDeclaredFields() 方法。这将为您提供一组 Field 对象。

然后您可以通过调用 Field.getType() 来获取每个字段的类。然后您可以使用反射来查找类的 printResult() 方法并在目标对象的相应字段中的值上调用它。

注意事项:

  1. Class 返回的 getType() 可以表示原始类型或数组类型而不是类。此 Class 将代表字段的擦除类型。

  2. 如果您想要源代码中声明的 Type,请改用 Field.getGenericType()