@SuppressWarnings("unchecked")
	private void initialize() {

		List<ObjectColumn<T>> columns = new LinkedList<ObjectColumn<T>>();

		// Search fields
		Field[] fields = type.getDeclaredFields();
		for (Field field : fields) {
			for (Annotation annotation : field.getDeclaredAnnotations()) {
				if (annotation instanceof Column) {
					Column _column = (Column) annotation;
					ObjectColumn<T> column = new FieldColumn<T>(_column, type,
							field);
					columns.add(column);
					if (_column.index() >= 0) {
						column.setIndex(_column.index());
					}
				}
			}
		}

		// Search methods
		Method[] methods = type.getDeclaredMethods();
		for (Method method : methods) {
			for (Annotation annotation : method.getDeclaredAnnotations()) {
				if (annotation instanceof Column) {
					Column _column = (Column) annotation;
					ObjectColumn<T> column = new MethodColumn<T>(_column, type,
							method);
					columns.add(column);
					if (_column.index() >= 0) {
						column.setIndex(_column.index());
					}
				}
			}
		}

		Collections.sort(columns);
		this.columns = columns.toArray(new ObjectColumn[columns.size()]);
	}