我正在处理一些自动生成的旧版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定义为供应商吗?如果可能,如何定义它?
谢谢。
最佳答案
如果我可以声明您的方法(getData
和getName
)public
,则以下对我有用。我没有使用任何供应商。
/**
* 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()
。