Caelum | Ensino e Inovação - Cursos de Java, Scrum, Ruby on Rails


Mirror DSL: facilitando o uso da API de reflection

Por Jonas Abreu em 17/11/08

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!

  • Share/Bookmark

12 Comments »

  1. 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

  2. Parabéns ! Ficou muito legal ! Idéias simples assim que eu me pergunto! Como nunca pensei nisto antes … :D

    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

  3. Show de bola! Parabéns!

    Comment by Leandro Silva — November 17, 2008 @ 11:24 pm

  4. Muito bom trabalho! ;)

    Comment by Laubstein — November 17, 2008 @ 11:50 pm

  5. Parabéns pela criação desse projeto!

    Comment by Rafael Carneiro — November 18, 2008 @ 3:47 am

  6. Parabéns, API muito bacana mesmo. Ninguém merece utilizar reflections “puro”, rs :)

    Comment by Rafael Ponte — November 18, 2008 @ 11:50 am

  7. 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

  8. O BeanUtils é praticamente igual em funcionalidade ne?

    Comment by henrique — November 20, 2008 @ 6:59 am

  9. 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

  10. 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

  11. 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

  12. 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

RSS feed for comments on this post. TrackBack URL

Leave a comment




Caelum | Ensino e Inovação
São Paulo: Rua Vergueiro, 3185, cj. 87, próximo ao Metrô Vila Mariana   |   Tel. (11) 5571-2751
Rio de Janeiro: Rua Senador Dantas, 80, cj. 307/308 - Centro   |   Tel. (21) 2220-4156 ou 2297-0033
Brasília: SCS Qd. 8 Bl. B-50, Sala 521 - Ed. Venâncio 2000   |   Tel. (61) 3039-4222