我正在处理一些自动生成的旧版Java代码,该代码具有相同的方法名称和返回类型,但未实现任何接口。我想找到一些处理电话的常用方法。

例如,我有一组Java类A1,A2,它们都包含一个方法“ getData()”,getData方法将返回一组其他的类实例,例如B1,​​B2。然后在B1,B2中,它们都具有“ getName”之类的方法。

我需要调用A.getData()。getName()。除了使用Java反射之外,还有什么适当的方法来处理这些情况?

class A1 {
  B1 b;
  B1 getData() {
      return b;
  }
}

class B1 {
  String getName() {
      return "myname in B1";
  }
}


如果B1,B2实现具有getName方法的某些接口(例如NameInterface),则可以使用Supplier,如下所示:

A1 a1 = ...
A2 a2 = ...
doGetName(a1::getData);
doGetName(a2::getData);

void doGetName(Supplier<NameInterface> func) {
    func.get().getName();
}


但不幸的是,B1,B2也是自动生成的旧代码,我无法为其分配接口。

我也可以将B1,B2定义为供应商吗?如果可能,如何定义它?

谢谢。

最佳答案

如果我可以声明您的方法(getDatagetNamepublic,则以下对我有用。我没有使用任何供应商。

/**
 * Requires that {@code a} has a public method getData that returns an object with a public getName method
 *
 * @param a
 * @return a.getData().getName(); or null if the methods don’t exist
 */
public static String doGetName(Object a) {
    try {
        Class<?> aClass = a.getClass();
        Method getDataMethod = aClass.getMethod("getData");
        Object b = getDataMethod.invoke(a);
        Class<?> bClass = b.getClass();
        Method getNameMethod = bClass.getMethod("getName");
        Object name = getNameMethod.invoke(b);
        return name.toString();
    } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        System.out.println(e);
        return null;
    }
}


以电话为例

    System.out.println(doGetName(new A1()));


请根据您的需要进行修改。

如果您的方法不是公开的,则可以使用getDeclaredMethod()代替getMethod()

09-10 07:49
查看更多