使用反射对bean的collection属性赋值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用反射对bean的collection属性赋值相关的知识,希望对你有一定的参考价值。
反射对bean的collection属性赋值
对collection使用反射创建时会遇到不知道具体实现类型而烦恼
比如:
class School{
private List classes ; //班级列表
public void setClasses(List classes){
this.classes=classes;
}
pulbic List getClasses(){
return this classes;
}
}
Class<?> schoolClazz=Class.forName(School.class.getTypeName());
schoolClazz.getMethod("setClasses",argsClass);
//这里argsClass应该是具体的实现类 很明确这里是需要Arraylist 但是如果是这样代码
class School{
private Collection classes ; //班级列表
public void setClasses(Collection classes){
this.classes=classes;
}
pulbic Collection getClasses(){
return this classes;
}
}
//惨了 不知道实现类是什么了 应该是ArrayList.class 还是 HashSet.class ?
没办法了?
参考下spring里面的代码:
public static <E> Collection<E> createCollection(Class<?> collectionType, @Nullable Class<?> elementType, int capacity) {
Assert.notNull(collectionType, "Collection type must not be null");
if (collectionType.isInterface()) {
if (Set.class == collectionType || Collection.class == collectionType) {
return new LinkedHashSet<>(capacity);
}
else if (List.class == collectionType) {
return new ArrayList<>(capacity);
}
else if (SortedSet.class == collectionType || NavigableSet.class == collectionType) {
return new TreeSet<>();
}
else {
throw new IllegalArgumentException("Unsupported Collection interface: " + collectionType.getName());
}
}
else if (EnumSet.class == collectionType) {
Assert.notNull(elementType, "Cannot create EnumSet for unknown element type");
// Cast is necessary for compilation in Eclipse 4.4.1.
return (Collection<E>) EnumSet.noneOf(asEnumType(elementType));
}
else {
if (!Collection.class.isAssignableFrom(collectionType)) {
throw new IllegalArgumentException("Unsupported Collection type: " + collectionType.getName());
}
try {
return (Collection<E>) ReflectionUtils.accessibleConstructor(collectionType).newInstance();
}
catch (Throwable ex) {
throw new IllegalArgumentException(
"Could not instantiate Collection type: " + collectionType.getName(), ex);
}
}
}
这里返回了具体的实现类 直接使用它的返回的具体实现类
以上是关于使用反射对bean的collection属性赋值的主要内容,如果未能解决你的问题,请参考以下文章