org.sfm.reflect.meta.ArrayElementPropertyMeta Maven / Gradle / Ivy
package org.sfm.reflect.meta;
import java.lang.reflect.Type;
import java.util.List;
import org.sfm.reflect.ReflectionService;
import org.sfm.reflect.Setter;
import org.sfm.reflect.TypeHelper;
public class ArrayElementPropertyMeta extends PropertyMeta {
private final int index;
private final ArrayClassMeta arrayMetaData;
public ArrayElementPropertyMeta(String name, String column, ReflectionService reflectService, int index, ArrayClassMeta arrayMetaData) {
super(name, column, reflectService);
this.index = index;
this.arrayMetaData = arrayMetaData;
}
@Override
protected Setter newSetter() {
if (List.class.isAssignableFrom(TypeHelper.toClass(arrayMetaData.getType()))) {
return (Setter) new ListSetter(index);
} else if (TypeHelper.toClass(arrayMetaData.getType()).isArray()) {
return (Setter) new ArraySetter(index);
} else {
throw new IllegalArgumentException("Asking setter on unsupported type " + arrayMetaData.getType());
}
}
@Override
public Type getType() {
return arrayMetaData.getElementTarget();
}
public int getIndex() {
return index;
}
@Override
public boolean isPrimitive() {
return false;
}
@Override
public String getPath() {
return index + "." + getName();
}
private class ArraySetter implements Setter {
private final int index;
private ArraySetter(int index) {
this.index = index;
}
@Override
public void set(E[] target, E value) throws Exception {
target[index] = value;
}
}
private class ListSetter implements Setter, E> {
private final int index;
private ListSetter(int index) {
this.index = index;
}
@Override
public void set(List target, E value) throws Exception {
while(target.size() <= index) {
target.add(null);
}
target.set(index, value);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy