Mirror DSL: facilitando o uso da API de reflection
Por Jonas Abreu em 17/11/08No ú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!
API bacana! Só fiquei curioso: que problema comuns do dia a dia exigem reflection?
–Ivan, (que foge de reflection como diabo da cruz :P)
Comment by Ivan — November 17, 2008 @ 8:18 pm
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?
Comment by Roger Leite — November 17, 2008 @ 9:29 pm
Show de bola! Parabéns!
Comment by Leandro Silva — November 17, 2008 @ 11:24 pm
Muito bom trabalho!
Comment by Laubstein — November 17, 2008 @ 11:50 pm
Parabéns pela criação desse projeto!
Comment by Rafael Carneiro — November 18, 2008 @ 3:47 am
Parabéns, API muito bacana mesmo. Ninguém merece utilizar reflections “puro”, rs
Comment by Rafael Ponte — November 18, 2008 @ 11:50 am
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).
Comment by jonas — November 19, 2008 @ 5:52 am
O BeanUtils é praticamente igual em funcionalidade ne?
Comment by henrique — November 20, 2008 @ 6:59 am
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).
Comment by jonas — November 20, 2008 @ 3:03 pm
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?
Comment by Davyd Santos — December 11, 2008 @ 11:35 pm
Ainda não é possível. Essa é uma das idéias que talvez implementemos no futuro, mas ainda não temos nada nem encaminhado.
Comment by Jonas Abreu — December 14, 2008 @ 9:48 am
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/.
Comment by Fabio Kung — December 15, 2008 @ 3:07 pm