【问题标题】:How to invoke a method with a superclass如何使用超类调用方法
【发布时间】:2009-10-26 22:18:37
【问题描述】:

我正在尝试调用一个方法,该方法将超类作为参数,实例中有子类。

public String methodtobeinvoked(Collection<String> collection);

现在如果通过调用

List<String> list = new ArrayList();
String methodName = "methodtobeinvoked";
...
method = someObject.getMethod(methodName,new Object[]{list});

没有这样的方法异常会失败

SomeObject.methodtobeinvoked(java.util.ArrayList);

即使存在可以接受参数的方法。

对解决此问题的最佳方法有什么想法吗?

【问题讨论】:

  • 不需要重载;请看看我的更新。

标签: java methods subclass invoke superclass


【解决方案1】:

您需要在getMethod() 调用中指定参数types

method = someObject.getMethod("methodtobeinvoked", Collection.class);

对象数组是不必要的; java 1.5 支持可变参数。

更新(基于 cmets)

所以你需要做类似的事情:

Method[] methods = myObject.getClass().getMethods();
for (Method method : methods) {
  if (!method.getName().equals("methodtobeinvoked")) continue;
  Class[] methodParameters = method.getParameterTypes();
  if (methodParameters.length!=1) continue; // ignore methods with wrong number of arguments
  if (methodParameters[0].isAssignableFrom(myArgument.class)) {
    method.invoke(myObject, myArgument);
  }
}

上面只检查带有单个参数的 public 方法;根据需要更新。

【讨论】:

  • 调用的重点是我希望能够调用也动态指定的方法。即我不一定没有参数类型。方法 = someObject.getMethod(variableForMethodName, instanceOfsomeParameter);
  • @Sheldon - 如果你不知道参数类型,你知道什么?只是方法名称?在这种情况下,您可以使用Class.getMethods() 返回相关类的所有 公共方法,手动循环它们并调用您需要的方法。但是请注意,如果您不知道参数类型,您将无法区分重载方法(例如,具有相同名称但参数不同的方法)
  • 我认为这是在我的评论中解决的,无论哪种方式都无济于事。我想我可以只创建一个查找表或类似的东西,但我希望有一个优雅的解决方案,可以让我找到适用于给定参数类型的方法。有什么方法可以判断一个对象继承自哪些超类?
  • @Sheldon,当然。给定一个对象的实例,你可以调用 o.getClasss().getSuperclass()
  • 嗯,无论我向它传递 List、Set 还是其他任何使用集合接口的方法,方法都是相同的。我想我应该手动重载方法 x 次。
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2011-03-28
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多