import java.lang.reflect.Array;

public class GrowableArrayTest {
	public static void main(String[] args) {
		int[] ia = {1};
		System.out.println("ia consists of "+ia.length+" elements");
		ia = (int[]) arrayGrow(ia);
		System.out.println("ia consists of "+ia.length+" elements");

		int[] ib = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
		System.out.println("ib consists of "+ib.length+" elements");
		ib = (int[]) arrayGrow(ib);
		System.out.println("ib consists of "+ib.length+" elements");

		Person[] pa = new Person[3];
		pa[0] = new Person("hans");
		pa[1] = new Person("franz");
		pa[2] = new Person("fritz");
		System.out.println("pa consists of "+pa.length+" elements");
		pa = (Person[]) arrayGrow(pa);
		System.out.println("pa consists of "+pa.length+" elements");
	} //main()

	static Object arrayGrow(Object oldArray) {
		Class arrayClass = oldArray.getClass();
		if ( !arrayClass.isArray() )
			return null;

		Class componentType = arrayClass.getComponentType();

		int oldLength = Array.getLength(oldArray);
		int newLength = ( ((oldLength * 1.1) > oldLength + 1) ? (int) (oldLength * 1.1) : (oldLength + 1) );

		Object newArray = Array.newInstance(componentType, newLength );

		System.arraycopy(oldArray, 0, newArray, 0, oldLength);
		return newArray;
	} //arrayGrow()
} //class growableArrayTest

class Person {
	protected String name;

	public Person (String name) {
		this.name = name;
	} //constructor
} //class Person