Mirror DSL: facilitando o uso da API de reflection

Postado em 17. nov, 2008 por 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!

Jonas Abreu

Tags: , , , , , ,

12 Respostas para “Mirror DSL: facilitando o uso da API de reflection”

  1. 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 :P )

  2. Roger Leite

    17. nov, 2008

    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?

  3. Leandro Silva

    17. nov, 2008

    Show de bola! Parabéns!

  4. Laubstein

    17. nov, 2008

    Muito bom trabalho! ;)

  5. Rafael Carneiro

    18. nov, 2008

    Parabéns pela criação desse projeto!

  6. Rafael Ponte

    18. nov, 2008

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

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

  8. henrique

    20. nov, 2008

    O BeanUtils é praticamente igual em funcionalidade ne?

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

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

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

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

Deixar uma Resposta