Mirror DSL: facilitando o uso da API de reflection
Postado em 17. nov, 2008 por Jonas Abreu em Inovação, Java
No último domingo foi feito o primeiro release público do projeto Mirror (versão 1.2).
O Mirror é um projeto que tem por objetivo facilitar o uso da Java Reflection API, removendo boa parte da burocracia (como as diversas checked exceptions que são lançadas) e utilizando uma DSL para melhorar a legibilidade do código.
Com essa remoção de burocracia e a DSL, é possível transformar o seguinte código:
Field toSet = null;
for (Field f : target.getClass().getDeclaredFields()) {
if (f.getName().equals("field")) {
toSet = f;
}
}
if (toSet != null && ((toSet.getModifiers() & Modifier.STATIC) == 0)
&& ((toSet.getModifiers() & Modifier.FINAL) == 0)) {
toSet.setAccessible(true);
toSet.set(target, value);
}
em algo mais legível e expressivo:
Mirror.on(target).set().field("fieldName").withValue(value);
Atualmente o Mirror possui suporte para lidar com as operações reflectivas mais comuns (como instanciar objetos, invocar métodos, ler ou escrever atributos, etc). Ele foi desenvolvido por Adriano Almeida, Diego Feitosa e eu, todos consultores/instrutores aqui da Caelum, enquanto enfretavamos problemas comuns no dia a dia.
Esperamos que possa ser útil para vocês também!
ASSINE NOSSO RSS




Ivan
17. nov, 2008
API bacana! Só fiquei curioso: que problema comuns do dia a dia exigem reflection?
–Ivan, (que foge de reflection como diabo da cruz
)
Roger Leite
17. nov, 2008
Parabéns ! Ficou muito legal ! Idéias simples assim que eu me pergunto! Como nunca pensei nisto antes …
Aproveitando, um dúvida que fiquei, o Mirror está usando “somente” o conceito de Fluent Interface não? Para ser uma DSL mesmo, não teria que ser algo como: “On a target object, set fieldName with value.” igual colocaram no site?
Leandro Silva
17. nov, 2008
Show de bola! Parabéns!
Laubstein
17. nov, 2008
Muito bom trabalho!
Rafael Carneiro
18. nov, 2008
Parabéns pela criação desse projeto!
Rafael Ponte
18. nov, 2008
Parabéns, API muito bacana mesmo. Ninguém merece utilizar reflections “puro”, rs
jonas
19. nov, 2008
Antes de mais nada, obrigado pelos comentários e feedback.
@Ivan, em geral, quando queremos usar algum tipo de convenção para evitar configuração, vamos ter que apelar pra reflection. Sem contar que em alguns momentos facilita muito o entendimento do código.
@Roger, no caso, estou usando uma DSL interna (para prover checagem em tempo de compilação e não precisar criar um parser). A DSL fica com um pouco mais de barulho sintático, mas o objetivo é o mesmo. Manter a “linguagem” dentro do domínio (no caso, reflection).
henrique
20. nov, 2008
O BeanUtils é praticamente igual em funcionalidade ne?
jonas
20. nov, 2008
Olá Henrique,
Pelo que vi no site do BeanUtils, eles vão além e possuem api para introspecção tambem.
Mas na parte de reflection, devem ser bem próximos. Apenas usam formas diferentes para facilitar o uso (o Mirror usa uma DSL e o BeanUtils utiliza wrappers).
Davyd Santos
11. dez, 2008
Uma dúvida que surgiu enquanto tava dando uma olhada na API, na verdade soh pra confirmar pois pelo que vi é necessário informar a classe base de procura, se não é possível com o Mirror fazer algo do tipo:
-Class[] classesComAnotacao = Mirror.reflectAll().annotations(AnnotationType.class).atClass();
-Method metodosComAnotacao = Mirror.reflectAll().annotations(AnnotationType.class).atMethod();
-Field atributosComAnotacao = Mirror.reflectAll().annotations(AnnotationType.class).atField();
Resumindo: Tem como ele executar as funcionalidades com todas as classes do classLoader?
Jonas Abreu
14. dez, 2008
Ainda não é possível. Essa é uma das idéias que talvez implementemos no futuro, mas ainda não temos nada nem encaminhado.
Fabio Kung
15. dez, 2008
Oi Davyd,
Classpath scanning não é uma tarefa simples. Enquanto o pessoal não implementa no Mirror, pode dar uma olhada no http://scannotation.sourceforge.net/.