package jef.tools.reflect; import java.lang.annotation.Annotation; import java.lang.reflect.Array; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.NoSuchElementException; import jef.tools.Assert; public final class ArrayWrapper extends BeanWrapper{ private Object bean; private Class<?> arrayClass; private int length; public ArrayWrapper(Object obj) { super(obj); this.bean=obj; Class<?> clz=obj.getClass(); Assert.isTrue(clz.isArray()); this.arrayClass=clz.getComponentType(); this.length=Array.getLength(obj); } @Override public boolean isProperty(String fieldName) { try{ int i=Integer.parseInt(fieldName); return i<length; }catch(NumberFormatException e){ return false; } } @Override public boolean isReadableProperty(String fieldName) { return isProperty(fieldName); } @Override public boolean isWritableProperty(String fieldName) { return isProperty(fieldName); } @Override public Type getPropertyType(String fieldName) { return arrayClass; } @Override public Object getWrapped() { return bean; } @Override public String getClassName() { return "["+arrayClass.toString(); } @Override public Object getPropertyValue(String name) { try{ int i=Integer.parseInt(name); if(i<length){ return Array.get(bean, i); } }catch(NumberFormatException e){ } throw new NoSuchElementException(name); } @Override public void setPropertyValue(String name, Object newValue) { try{ int i=Integer.parseInt(name); if(i<length){ Array.set(bean, i,newValue); } }catch(NumberFormatException e){ } throw new NoSuchElementException(name); } private Collection<String> names; @Override public Collection<String> getPropertyNames() { if(names!=null)return names; Collection<String> values=new ArrayList<String>(); for(int i=0;i<length;i++){ values.add(String.valueOf(i)); } names=values; return values; } @Override public Collection<String> getRwPropertyNames() { return getPropertyNames(); } @Override public Property getProperty(String name) { try{ int i=Integer.parseInt(name); if(i<length){ return new ArrayProperty(i); } }catch(NumberFormatException e){ } throw new NoSuchElementException(name); } @Override public Collection<? extends Property> getProperties() { return null; } @Override public <T extends Annotation> T getAnnotationOnField(String name, Class<T> clz) { return null; } @Override public <T extends Annotation> T getAnnotationOnGetter(String name, Class<T> clz) { return null; } @Override public <T extends Annotation> T getAnnotationOnSetter(String name, Class<T> clz) { return null; } @Override public Class<?> getPropertyRawType(String fieldName) { return arrayClass; } private final class ArrayProperty implements Property{ int index; public String getName() { return String.valueOf(index); } public boolean isReadable() { return true; } public boolean isWriteable() { return true; } public Object get(Object obj) { return Array.get(obj, index); } public void set(Object obj, Object value) { Array.set(obj, index, value); } public Class<?> getType() { return ArrayWrapper.this.arrayClass; } public Type getGenericType() { return ArrayWrapper.this.arrayClass; } private ArrayProperty(int i){ this.index=i; } } }