如何从 Java bean 属性 中提取类型参数?
How to extract the type argument from a Java bean property?
我有一个任意的 Java bean,如下所示:
class SomeBean {
public Map<String, SomeOtherBean> getOtherBeans() { ... }
public void setOtherBeans(Map<String, SomeOtherBean> otherBeans) { ... }
}
并且我想使用通用方法提取类型 SomeOtherBean
。在存在 Java 的类型擦除的情况下,这甚至可能吗?
是的,即使在游戏中进行擦除也是可能的。
Magnolia TypeMappingImpl
[1](根据 GPL 和 Magnolia 网络协议 双重许可 )的以下实现从setter 方法:
private List<Class<?>> inferGenericTypes(Method method) {
List<Class<?>> inferredTypes = new ArrayList<Class<?>>();
Type[] parameterTypes = method.getGenericParameterTypes();
for (Type parameterType : parameterTypes) {
if (parameterType instanceof ParameterizedType) {
ParameterizedType type = (ParameterizedType) parameterType;
for (Type t : type.getActualTypeArguments()) {
if (t instanceof ParameterizedType) {
// this the case when parameterized type looks like this: Collection<List<String>>
// we care only for raw type List
inferredTypes.add((Class<?>) ((ParameterizedType) t).getRawType());
} else if (t instanceof WildcardType) {
WildcardType wildcardType = (WildcardType) t;
if (wildcardType.getUpperBounds().length > 0) {
// upper bounds (? extends Number)
inferredTypes.add((Class<?>) wildcardType.getUpperBounds()[0]);
} else {
// lower bounds (? super Number)
inferredTypes.add((Class<?>) wildcardType.getLowerBounds()[0]);
}
} else {
inferredTypes.add((Class<?>) t);
}
}
}
}
return inferredTypes;
}
[1]: 来自包 info.magnolia.jcr.node2bean.impl
我有一个任意的 Java bean,如下所示:
class SomeBean {
public Map<String, SomeOtherBean> getOtherBeans() { ... }
public void setOtherBeans(Map<String, SomeOtherBean> otherBeans) { ... }
}
并且我想使用通用方法提取类型 SomeOtherBean
。在存在 Java 的类型擦除的情况下,这甚至可能吗?
是的,即使在游戏中进行擦除也是可能的。
Magnolia TypeMappingImpl
[1](根据 GPL 和 Magnolia 网络协议 双重许可 )的以下实现从setter 方法:
private List<Class<?>> inferGenericTypes(Method method) {
List<Class<?>> inferredTypes = new ArrayList<Class<?>>();
Type[] parameterTypes = method.getGenericParameterTypes();
for (Type parameterType : parameterTypes) {
if (parameterType instanceof ParameterizedType) {
ParameterizedType type = (ParameterizedType) parameterType;
for (Type t : type.getActualTypeArguments()) {
if (t instanceof ParameterizedType) {
// this the case when parameterized type looks like this: Collection<List<String>>
// we care only for raw type List
inferredTypes.add((Class<?>) ((ParameterizedType) t).getRawType());
} else if (t instanceof WildcardType) {
WildcardType wildcardType = (WildcardType) t;
if (wildcardType.getUpperBounds().length > 0) {
// upper bounds (? extends Number)
inferredTypes.add((Class<?>) wildcardType.getUpperBounds()[0]);
} else {
// lower bounds (? super Number)
inferredTypes.add((Class<?>) wildcardType.getLowerBounds()[0]);
}
} else {
inferredTypes.add((Class<?>) t);
}
}
}
}
return inferredTypes;
}
[1]: 来自包 info.magnolia.jcr.node2bean.impl