Mirror DSL: facilitando o uso da API de reflection

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!

12 Comentários

  1. Ivan 17/11/2008 at 20:18 #

    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/11/2008 at 21:29 #

    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?

  3. Leandro Silva 17/11/2008 at 23:24 #

    Show de bola! Parabéns!

  4. Laubstein 17/11/2008 at 23:50 #

    Muito bom trabalho! 😉

  5. Rafael Carneiro 18/11/2008 at 03:47 #

    Parabéns pela criação desse projeto!

  6. Rafael Ponte 18/11/2008 at 11:50 #

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

  7. jonas 19/11/2008 at 05:52 #

    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/11/2008 at 06:59 #

    O BeanUtils é praticamente igual em funcionalidade ne?

  9. jonas 20/11/2008 at 15:03 #

    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/12/2008 at 23:35 #

    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/12/2008 at 09:48 #

    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/12/2008 at 15:07 #

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

Deixe uma resposta