Java 如何调用具有相同名称和不同返回值的不同类型对象的方法?

Java 如何调用具有相同名称和不同返回值的不同类型对象的方法?,java,generics,reflection,jaxb,Java,Generics,Reflection,Jaxb,我有很多由JAXB生成的类,我无法更改它们。我必须以一种非常相似的方式获取一些对象的属性值,然后用它们填充表。这里我给出了两个这样的getter方法的代码: private String getPropertyIdentifierStringOrNull(IdentifierType obj) { if(obj != null) return obj.getValue(); else return null; } private XMLGrego

我有很多由JAXB生成的类,我无法更改它们。我必须以一种非常相似的方式获取一些对象的属性值,然后用它们填充表。这里我给出了两个这样的getter方法的代码:

private String getPropertyIdentifierStringOrNull(IdentifierType obj)
{
    if(obj != null)
        return obj.getValue();
    else
        return null;
}

private XMLGregorianCalendar getPropertyXMLGregorianCalendarOrNull(DateType obj)
{
    if(obj != null)
        return obj.getValue();
    else
        return null;
}
DateType和IdentifierType没有公共的supperclass,在本例中,代码返回值可以是不同的类型

我试图写一个方法,而不是一堆这样的方法。我使用反射的通用方法提出了这个解决方案:

@SuppressWarnings("unchecked")
private <T> T getPropertyOrNull(Object obj)
{
    if(obj != null)
    {
        try
        {
            return (T) obj.getClass().getMethod("getValue").invoke(obj);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    return null;
}
@SuppressWarnings(“未选中”)
私有T getPropertyOrNull(对象obj)
{
如果(obj!=null)
{
尝试
{
返回(T)obj.getClass().getMethod(“getValue”).invoke(obj);
}捕获(例外e)
{
e、 printStackTrace();
}
}
返回null;
}

这是进行此类调用的好方法还是有更好的解决方案?

我不会使用反射来实现这一点。相反,您可以使用从给定对象中提取所需属性的,如下所示:

static <T, U> U getPropertyOrNull(T obj, Function<? super T, ? extends U> extractor) {
    return obj != null ? extractor.apply(obj) : null;
}

除了不使用反射之外,这种方法的优点是它是类型安全的,也就是说,如果使用
IdentifierType
DateType::getValue
参数调用该方法,您将得到一个编译错误。

我认为它是完美的。只要你不能为这些类添加超级接口,你就需要反思。谢谢@Tamas,你的速度非常快。
IdentifierType identifier = new IdentifierType();
DateType date = new DateType();

String identifierValue = getPropertyOrNull(identifier, IdentifierType::getValue);

XMLGregorianCalendar dateValue = getPropertyOrNull(date, DateType::getValue);