2011-03-06 62 views
1

是否有一种常见的反射方法来查明java方法是否返回一组对象,如数组,列表,集合,集合和其他可迭代的子接口? 背后的故事是,我需要检查第三方方法的返回类型,说两两件事:如何检查“多对象”返回类型

  • 方法是否返回对象集(在 人类意义上的)?
  • 如果是 - 什么是组件类型?

例如,如果方法的返回类型为Vector<A>A[]Set<A>,等等,我想那A通过我的代码返回。 我是新来的反射/泛型,不想重新发明轮子,不确定我的方法是否正确。这是我迄今为止所做的:

private boolean isMultiple(Class clazz) { 
    return clazz.isArray() || Iterable.class.isAssignableFrom(clazz); 
    } 

    private Class getReturnComponentType(Method m) { 
    Class clazz = m.getReturnType(); 
    if(!isMultiple(clazz)) return clazz; // Not a collection 
    // Collection 
    if(clazz.isArray()) { 
     // How do I get Array's component type? 
     // return null; 
    } else { 
     // How do I get Iterable component type? 
     // return null; 
    } 
    } 

请帮忙。

+0

别忘了地图。 – jtahlborn 2011-03-06 17:40:33

回答

2
  1. 要获得可迭代组件类型:除了getReturnType()也使用getGenericReturnType()获得泛型类型。然后将其与Type子接口进行比较:GenericArrayType,ParameterizedType。

  2. 获取Array组件类型使用clazz.getComponentType()

+0

我会说,然后使用Collection.class.isAssignableFrom()或Iterable.class.isAssignableFrom()或Class.isArray()。 – AlexR 2011-03-06 16:26:08

+0

他已经这样做了。现在他需要类型参数(即名单中的T) – 2011-03-06 16:33:37

+0

谢谢。我主要担心我的isMultiple方法,很高兴没关系。 – Osw 2011-03-06 16:48:18