【问题标题】:use variable as object name to call the object method使用变量作为对象名来调用对象方法
【发布时间】:2013-06-25 19:05:53
【问题描述】:

我有一个包含几个不同对象的类。

我可以使用 getDeclaredFields 来获取所有对象的名称列表, 但我想在这些对象中调用一个方法。
我该怎么做?

ClassA a = new ClassA();
Class cls = c.getClass();
Field[] fields = cls.getDeclaredFields();
for(int i = 0; i< fields.length;i++) {
   System.out.println("Field = " + fields[i].toString());
   System.out.prontln(fields[i].method()) // how can I call the method from object fields[i]             
}

更多信息:我使用反射的原因是我想编写一个可用于测试所有其他类的对象是否正确存在的测试类。

testclass(class a),获取类a中的所有对象名称,并使用object.exists()方法验证该对象是否存在。

这是我的代码:我有一些对话框类,每个对话框类都有一些 menuitem 类、复选框类、文本字段类,我想编写一个可用于验证所有复选框、文本字段是否存在的类(使用 checkbox.exist (), textfield.exist() ...) 在给定的对话框中。

ToolsMenu c = new ToolsMenu();
        Class cls = c.getClass();
        Field[] fields = cls.getDeclaredFields();
        for(int i = 0; i< fields.length;i++) {
            System.out.println("Field = " + fields[i].toString());
            println( fields[i].getDeclaringClass().exists()

我可以使用 getdeclaringclass 来获取 field[i] 类,但是如何调用在 checkboxes、textfields 类中定义的方法 exists()。

【问题讨论】:

  • 那你感兴趣的字段类型是什么,方法是什么?
  • 我建议你谷歌“java反射api”。有很多关于如何做到这一点的教程。但是我的问题是:你为什么首先使用反射?
  • 您是在尝试调用任何方法还是您知道方法签名?
  • 我使用反射的原因是我想写一个测试类,可以用来测试所有其他类的对象是否正确存在。 testclass(class a),获取类a中的所有对象名称,并使用object.exists()方法验证该对象是否存在。

标签: java object reflection methods


【解决方案1】:

你可以这样称呼它:

...
Class clazz= fields[i].get(c).getClass();
clazz.getMethod("methodName").invoke(fields[i].get(c));
...

"methodName" 是应该调用的方法的名称。您还可以将一些参数传递给该方法。

【讨论】:

  • 你应该使用 c 而不是 cls
  • fields[i] 会返回对象的名称,我认为我们不能使用字符串来调用对象的方法。
  • fields[i] 将返回 Field 对象。
【解决方案2】:

我不确定您为什么要使用反射。你可以简单地做

a.field.method()

如果field 及其method() 声明了正确的访问修饰符。

【讨论】:

  • 我认为method() 是一个例子,OP 不知道他调用的方法的名称,这就是他使用反射的原因。但是,这本身并没有多大意义......
  • field 是 field[] 中的一个字符串,我如何将它转移到一个类中?。
  • 在使用declaredfield之前,我不知道该字段的名称,在declaredfield之后,我们可以使用a.field[i].method()吗?
  • @bitma 我的回答假设您知道字段和方法的名称。如果你不知道这些,那么你肯定需要使用反射。我建议您查看the official Oracle tutorial 寻求帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多