如何检查“多对象”返回类型
是否有一种常见的反射方法来确定java方法是否返回一组对象,如数组、列表、集合、集合和其他可迭代子接口? 背后的故事是我需要检查第三方方法的返回类型并说两件事:
- 方法是否返回对象集(在 人的感觉)?
- 如果是 - 组件类型是什么?
例如,如果方法的返回类型是 Vector
、A[]
、Set
等,我想要
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;
}
}
请帮忙。
Is there a common reflection approach to find out whether java method returns a set of objects like array, list, set, collection and other iterable subinterfaces?
The story behind is that I need to inspect third-party method's return type and say two things:
- Does method return set of objects (in
human sense)? - If yes - what is the component type?
For example if method's return type is Vector<A>
, A[]
, Set<A>
, etc, I want that A
to be returned by my code.
I'm new to reflection/generics, don't want to re-invent the wheel and not sure my approach is correct. Here's what I've done so far:
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;
}
}
Please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
要获取可迭代组件类型:除了
getReturnType()
之外,还可以使用getGenericReturnType()
获取泛型类型。然后将其与Type
子接口:GenericArrayType、ParameterizedType。要获取数组组件类型,请使用
clazz.getComponentType()
。To get Iterable component type: Besides
getReturnType()
also usegetGenericReturnType()
to get generic types. Then compare it toType
subinterfaces: GenericArrayType, ParameterizedType.To get Array component type use
clazz.getComponentType()
.