Eu sou novo em Java; através dos meus estudos, li que a reflexão é usada para invocar classes e métodos e para saber quais métodos são implementados ou não.
Quando devo usar a reflexão e qual a diferença entre usar objetos de reflexão e instanciar e chamar métodos da maneira tradicional?
java
reflection
Hamzah khammash
fonte
fonte
Respostas:
A reflexão é muito mais lenta do que chamar métodos pelo nome, porque é necessário inspecionar os metadados no código de bytes, em vez de apenas usar endereços e constantes pré-compilados.
A reflexão também é mais poderosa: você pode recuperar a definição de a
protected
oufinal
membro, remover a proteção e manipulá-la como se tivesse sido declarada mutável! Obviamente, isso subverte muitas das garantias que a linguagem normalmente oferece para seus programas e pode ser muito, muito perigosa.E isso explica muito bem quando usá-lo. Normalmente, não. Se você quiser chamar um método, basta chamá-lo. Se você deseja alterar um membro, declare-o mutável em vez de ficar atrás das costas da compilação.
Um uso útil da reflexão no mundo real é ao escrever uma estrutura que precisa interoperar com classes definidas pelo usuário, onde o autor da estrutura não sabe quais serão os membros (ou mesmo as classes). A reflexão lhes permite lidar com qualquer classe sem conhecê-la com antecedência. Por exemplo, eu não acho que seria possível escrever uma biblioteca complexa orientada a aspectos sem reflexão.
As another example, JUnit used to use a trivial bit of reflection: it enumerates all methods in your class, assumes that all those called
testXXX
are test methods, and executes only those. But this can now be done better with annotations instead, and in fact JUnit 4 has largely moved to annotations instead.fonte
Eu era como você uma vez, não sabia muito sobre reflexão - ainda não - mas usei uma vez.
Eu tive uma classe com duas classes internas, e cada classe tinha muitos métodos.
Eu precisava invocar todos os métodos da classe interna, e invocá-los manualmente teria sido muito trabalhoso.
Usando a reflexão, eu poderia invocar todos esses métodos em apenas 2-3 linhas de código, em vez do número dos métodos em si.
fonte
Eu agruparia os usos da reflexão em três grupos:
fonte
O Reflection permite que um programa trabalhe com código que pode não estar presente e faça isso de maneira confiável.
"Código normal" possui trechos como os
URLConnection c = null
quais, por sua simples presença, fazem com que o carregador de classes carregue a classe URLConnection como parte do carregamento dessa classe, lançando uma exceção ClassNotFound e saindo.O Reflection permite carregar classes com base em seus nomes em forma de cadeia e testá-las para várias propriedades (úteis para várias versões fora de seu controle) antes de iniciar as classes reais que dependem delas. Um exemplo típico é o código específico do OS X usado para fazer com que os programas Java pareçam nativos no OS X, que não estão presentes em outras plataformas.
fonte
Fundamentalmente, reflexão significa usar o código do seu programa como dados.
Portanto, usar a reflexão pode ser uma boa idéia quando o código do seu programa é uma fonte útil de dados. (Mas existem compensações, portanto nem sempre é uma boa ideia.)
Por exemplo, considere uma classe simples:
e você deseja gerar XML a partir dele. Você pode escrever um código para gerar o XML:
Mas isso é muito código clichê, e toda vez que você altera a classe, é necessário atualizar o código. Realmente, você pode descrever o que esse código faz como
Este é um algoritmo, e a entrada do algoritmo é a classe: precisamos do nome e dos nomes, tipos e valores de suas propriedades. É aqui que entra a reflexão: fornece acesso a essas informações. Java permite inspecionar tipos usando os métodos da
Class
classe.Mais alguns casos de uso:
No entanto, reflexão completa significa não apenas olhar para o código existente (que por si só é conhecido como "introspecção"), mas também modificar ou gerar código. Existem dois casos de uso proeminentes em Java para isso: proxies e zombarias.
Digamos que você tenha uma interface:
e você tem uma implementação que faz algo interessante:
E, de fato, você tem uma segunda implementação também:
Agora você também deseja alguma saída de log; você simplesmente deseja uma mensagem de log sempre que um método é chamado. Você pode adicionar saída de log a todos os métodos explicitamente, mas isso seria irritante e você teria que fazer isso duas vezes; uma vez para cada implementação. (Ainda mais quando você adiciona mais implementações.)
Em vez disso, você pode escrever um proxy:
Novamente, porém, há um padrão repetitivo que pode ser descrito por um algoritmo:
e a entrada desse algoritmo é a definição da interface.
O Reflection permite definir uma nova classe usando esse algoritmo. Java permite fazer isso usando os métodos da
java.lang.reflect.Proxy
classe, e existem bibliotecas que oferecem ainda mais poder.Então, quais são as desvantagens da reflexão?
fonte
O Reflection pode manter automaticamente partes do seu programa sincronizadas, onde anteriormente, você precisaria atualizar o programa manualmente para usar as novas interfaces.
fonte