Este é um assunto que nunca estudei, e sempre achava que seria um bicho de 7 cabeças. Mas dando uma olhada, percebi
que é até bem fácil e uma mão na roda em várias situações. Você só não pode se empolgar e sair utilizando em tudo quanto é lugar. Use com moderação!
A criação de um Annotation é muito fácil. Você cria um novo .java, que ao invés de ter a palavra chave class usa @interface. Coloque alguns Annotations(use annotation para criar annotation, eita) e pronto, antes do miojo ficar pronto o annotation já estará finalizado.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Requerido {
long menorValor() default 0;
long maiorValor() default Long.MAX_VALUE;
}
Vamos criar um objeto qualquer para anotar suas propriedades com o nosso novo Annotation quentinho que acabou de sair do forno.
public class UmObjetoAnotatdo {
@Requerido(menorValor=10, maiorValor=100)
public int valorProduto;
@Requerido
public String nome;
@Requerido
public short valorCusto;
}

Onde as coisas complicam um pouco é na hora de perceber o annotation em uma classe ou propriedade em runtime. Tem um trabalhinho chato de ficar percorrendo o objeto, a procura do annotation para fazer o que o seu annotation foi criado para fazer.
No caso criei uma anotação para verificar automaticamente se campos obrigatórios de um objeto foram preenchidos e se ele respeita seu valor mínimo e máximo, se isso não for respeitado levanto uma exceção. Infelizmente este código tem um pouco de recursão, sempre evito utilizar, mas neste caso achei que cairia bem.
public class TestarAnnotation {
public static void validaCamposObrigatorios(Object dto) throws Exception {
Field[] camposDoObjeto = dto.getClass().getDeclaredFields();
for (int i = 0; i < camposDoObjeto.length; i++) { if (camposDoObjeto[i].isAnnotationPresent(Requerido.class)) { camposDoObjeto[i].setAccessible(true); Object valorDoCampo = camposDoObjeto[i].get(dto); if (valorDoCampo == null) throw new Exception("O campo " + camposDoObjeto[i].getName() + " é obrigatório. Valor Recebido: " + valorDoCampo); camposDoObjeto[i].isAnnotationPresent(Requerido.class); Requerido anotacao = camposDoObjeto[i].getAnnotation(Requerido.class); if (valorDoCampo instanceof String) { if (((String) valorDoCampo).equalsIgnoreCase("")) throw new Exception("O campo " + camposDoObjeto[i].getName() + " é obrigatório. Valor Recebido: " + valorDoCampo); } else if (valorDoCampo instanceof Long) { if (anotacao.menorValor() >= (Long) valorDoCampo)
throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
+ anotacao.menorValor());
if (anotacao.maiorValor() <= (Long) valorDoCampo) throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: " + anotacao.maiorValor()); } else if (valorDoCampo instanceof Integer) { if (anotacao.menorValor() >= (Integer) valorDoCampo)
throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
+ anotacao.menorValor());
if (anotacao.maiorValor() <= (Integer) valorDoCampo) throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: " + anotacao.maiorValor()); } else if (valorDoCampo instanceof Short) { if (anotacao.menorValor() >= (Short) valorDoCampo)
throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
+ anotacao.menorValor());
if (anotacao.maiorValor() <= (Short) valorDoCampo)
throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: "
+ anotacao.maiorValor());
} else {
validaCamposObrigatorios(dto);
}
}
}
}
public static void main(String[] args) throws Exception {
UmObjetoAnotatdo objeto = new UmObjetoAnotatdo();
objeto.nome = null;
objeto.valorCusto = 1;
objeto.valorProduto = 11;
try{
TestarAnnotation.validaCamposObrigatorios(objeto);
}
catch(Exception e){
System.out.println(e.getMessage());
}
objeto.nome = "Marcelo";
objeto.valorCusto = 1;
objeto.valorProduto = 1;
try{
TestarAnnotation.validaCamposObrigatorios(objeto);
}
catch(Exception e){
System.out.println(e.getMessage());
}
objeto.nome = "Marcelo";
objeto.valorCusto = 0;
objeto.valorProduto = 11;
try{
TestarAnnotation.validaCamposObrigatorios(objeto);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Executando a classe você receberá as mensagens:
O campo nome é obrigatório. Valor Recebido: null O campo valorProduto deve ter um valor maior que: 10 O campo valorCusto deve ter um valor maior que: 0
A primeira mensagem é porque a propriedade nome não está preenchida, a segunda porque o campo valorProduto está com um valor que não é maior que o mínimo de 10, e a terceira é porque o campo valorCusto deve possuir um valor maior que 0 para ser considerado preenchido.
Altera os valores das propriedades e veja qual o comportamento.
Espero ter ajudado alguém com este post! Boa noite pessoal!