reflexão e anotações no mundo java

Post on 11-Feb-2017

80 Views

Category:

Software

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Reflexão e AnotaçõesMateus Parente

REAPROVEITAR

REUTILIZAR

public class Funcionario {

private String nome;

private String endereco;

private Integer idade;

private BigDecimal salario;

...

}

VALIDADOR

VALIDADOR!= null

TIPOS DE SOLUÇÕESsofisticada

gambiarracriativa

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();if(funcionario.getNome() == null)

invalidos.add("nome");

if(funcionario.getEndereco() == null)invalidos.add("endereco");

return invalidos;}

}

PROBLEMAS

PROBLEMASnome de atributo

PROBLEMASnome de atributo

só funciona para Funcionario

PROBLEMASnome de atributo

só funciona para Funcionarioinclusão de atributo

PROBLEMASnome de atributo

só funciona para Funcionarioinclusão de atributo

código extenso

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

if(funcionario.getNome() == null)invalidos.add("nome");

if(funcionario.getEndereco() == null)invalidos.add("endereco");

if(funcionario.getTelefone() == null)invalidos.add("telefone");

if(funcionario.getDataDeNascimento() == null)invalidos.add("dataDeNascimento");

if(funcionario.getIdade() == null)invalidos.add("idade");

return invalidos;

}

}

HORA DE REFATOR

AR

MISSÃOdesconhecer meus atributos

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

Atributo[] atributos = funcionario.getAtributos();for(Atributo atributo : atributos){

if(atributo.getValue() == null)invalidos.add(atributo.getNome());

}return invalidos;

}

}

ProbleminhaAtributos não estão no Objeto, e sim, na Classe.

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

Classe classeDoFuncionario = funcionario.getClasse();Atributo[] atributos = classeDoFuncionario.getAtributos();for(Atributo atributo : atributos){

if(atributo.getValue() == null)invalidos.add(atributo.getNome());

}return invalidos;

}

}

Outro ProbleminhaValor dos Atributos não estão na classe, e sim, no Objeto

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

Classe classeDoFuncionario = funcionario.getClasse();Atributo[] atributos = classeDoFuncionario.getAtributos();for(Atributo atributo : atributos){

Object valor = atributo.buscar(funcionario);if(valor == null)

invalidos.add(atributo.getNome());}return invalidos;

}

}

VAMOS A REALIDADE

Class

java.lang.Class

Classfuncionario.getClass();Funcionario.class;Class.forName(“br.com.javou.Funcionario”)

FIELDjava.lang.reflect.Field

Fieldclazz.getFields();clazz.getDeclaredFields();

Adaptando...

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

Class<?> classeDoFuncionario = funcionario.getClass();Field[] atributos = classeDoFuncionario.getFields();for(Field atributo : atributos){

Object valor = atributo.get(funcionario);if(valor == null)

invalidos.add(atributo.getName());}return invalidos;

}

}

Pra variar... ProbleminhaclasseDoFuncionario.getFields()

ESTÁ VAZIA

getFields()x

getDeclaredFields()

Class

getFields()x

getDeclaredFields()

Classpublicos + superclass

publicos + privados

public class Validador {

public List<String> validar(Funcionario funcionario){List<String> invalidos = new ArrayList<>();

Class<?> classeDoFuncionario = funcionario.getClass();Field[] atributos = classeDoFuncionario.getDeclaredFields();for(Field atributo : atributos){

Object valor = atributo.get(funcionario);if(valor == null)

invalidos.add(atributo.getName());}return invalidos;

}

}

java.lang.IllegalAccessException: Class br.com.reflections.validadores.Validador can not access a member of class br.com.reflections.models.Funcionario with modifiers "private".

…public List<String> validar(Funcionario funcionario){

List<String> invalidos = new ArrayList<>();

Class<?> classeDoFuncionario = funcionario.getClass();Field[] atributos = classeDoFuncionario.getDeclaredFields();for(Field atributo : atributos){

atributo.setAccessible(true);Object valor = atributo.get(funcionario);if(valor == null)

invalidos.add(atributo.getName());}return invalidos;

}

public class Funcionario {

private String nome;

private String endereco;

private Integer idade;

private BigDecimal salario;

...

}

public void test(){

Funcionario funcionario = new Funcionario();funcionario.setNome(“Mateus”);funcionario.setEndereco(“Lagoa Redonda”);

Validador validador = new Validador();List<String> erros = validador.valida(funcionario);

assertTrue(erros.contains(“idade”));assertTrue(erros.contains(“salario”));assertFalse(erros.contains(“nome”));assertFalse(erros.contains(“endereco”));

}

@Test

Tudo funcionando

HORA DE REFATOR

AR

…public List<String> validar(Object entidade){

List<String> invalidos = new ArrayList<>();

Class<?> clazz = entidade.getClass();Field[] atributos = clazz.getDeclaredFields();for(Field atributo : atributos){

atributo.setAccessible(true);Object valor = atributo.get(entidade);if(valor == null)

invalidos.add(atributo.getName());}return invalidos;

}

COMPONENTESREUTILIZÁVEIS

PERSONALIZAR

MENSAGENS

public class Funcionario {

private String Nome;

private String Endereço;

private Integer Idade;

private BigDecimal Salário;

...

}

ANOTAÇÕES

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Validacao {

String descricao();

}

public class Funcionario {

@Validacao(descricao = ‘Nome completo’)

private String nome;

@Validacao(descricao = ‘Endereço’)

private String endereco;

}

…Class<?> clazz = entidade.getClass();

Field[] atributos = clazz.getDeclaredFields();for(Field atributo : atributos){

atributo.setAccessible(true);Object valor = atributo.get(entidade);if(valor == null) {

if(atributo.isAnnotationPresent(Validacao.class)){Validacao validacao =

atributo.getAnnotation(Validacao.class);invalidos.add(validacao.descricao());

}}

}

desvantagens

complexidade /

performance

obrigado

Perguntas

Referencias:Componentes Reutilizáveis em Java com Reflexão e Anotações - Eduardo Guerra

Laboratório Java com Testes, XML e Design Patterns - Caelum

top related