Annotations + Exceptions

Boa tarde,

Eu comecei a aprender Java há pouco tempo (questão de meses) e, por estar fazendo um projeto WEB protótipo, comecei a aprender como poderia captar de maneira “elegante” (como se diz na Caelum) certas exceções, como se um atributo é nulo (eu sei que já existe NullPointerException!) e se seu tamanho é maior que um limite, etc, por questões de posterior persistência no banco (Pelo que entendi, isso tem a ver com a persistência… corrijam caso estiver errado, por favor).

Criei algumas classes testes inventando uma anotação NotNull e uma exceção NotNullException. Além disso, criei uma classe básica Cliente, com só o atributo Nome e seus getters e setters.

Estão aqui :

Classe Cliente:

public class Cliente {

@NotNull
private String nome;

@NotNull
public String getNome() {

	return this.nome;

}

private void setNome(String x) {

	this.nome = x;

}

public Cliente(String x) {

	this.setNome(x);

}

}

Annotation NotNull :

@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)

public @interface NotNull {

}

Exception NotNullException:

public class NotNullException extends RuntimeException {

private static final long serialVersionUID = 123L;

public NotNullException(Object o)
		throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
	super("O valor não pode ser nulo!");
	this.naoNulo(o);

}

private void naoNulo(Object o) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

	Method[] m = o.getClass().getDeclaredMethods();

	for (Method x : m) {

		if (x.isAnnotationPresent(NotNull.class)) {

			if (x.invoke(o).toString().length() < 1) {

				throw this;

			}

		}

	}

}

}

Funcionou no método main:

public static void main(String[] args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

	Cliente c = new Cliente("");

	new NotNullException(c);

}

Mas eu achei esse código meio estranho, pois :

A Annotation é vazia assim mesmo? (Eu sei que dá para por argumentos,etc nela, mas funcionou sem nada);
O jeito que eu invoco a verificação da Exception está “formalmente correto”?

Enfim, sou bem novato nisso, e pode ser que falte conhecimento, principalmente teórico (sobre metadados etc), e por isso a construção pode ter saído “não elegante”.