Pergunta

Recentemente eu estava conversando com um colega sobre C++ e lamentou que não havia nenhuma maneira para assumir uma string com o nome da classe de um campo e extrair o campo com o mesmo nome;em outras palavras, que carece de reflexão.Ele me deu um olhar perplexo e perguntou se alguém iria precisar para fazer tal coisa.

Em cima da minha cabeça, não tive uma boa resposta para ele, diferente de "hey, eu preciso fazer isso agora".Então eu me sentei e veio com uma lista de algumas das coisas que eu tenho feito com a reflexão em vários idiomas.Infelizmente, a maioria dos meus exemplos vêm da minha programação para a web em Python, e eu estava esperando que as pessoas aqui teria mais exemplos.Aqui está a lista eu vim com:

  1. Dado um arquivo de configuração com linhas como
    x = "Olá Mundo!"
    y = 5.0
    definir dinamicamente os campos de alguns config objeto igual para os valores no arquivo.(Isso era o que eu queria fazer em C++, mas, na verdade, não conseguia fazer.)

  2. Quando a ordenação de uma lista de objetos, classificar com base em um arbitrário atributo dado que o atributo de nome a partir de um arquivo de configuração ou pedido na web.

  3. Quando o software de escrita que utiliza um protocolo de rede, a reflexão permite que você chamar os métodos baseados em valores de seqüência de caracteres a partir desse protocolo.Por exemplo, eu escrevi um robô de IRC, o que poderia traduzir
    !some_command arg1 arg2
    em uma chamada de método actions.some_command(arg1, arg2) e imprimir qualquer que seja a função retornou para o canal de IRC.

  4. Quando usando Python __getattr__ função (que é uma espécie de como o method_missing em Ruby/Smalltalk), eu estava trabalhando com uma classe com um monte de estatísticas, tais como late_total.Para cada estatística, eu queria ser capaz de adicionar _percent para obter essa estatística como uma porcentagem do total de coisas que eu estava de contagem (por exemplo, estatísticas.late_total_percent).A reflexão fez isso muito fácil.

Então, alguém aqui pode dar alguns exemplos de sua própria programação experiências de momentos de reflexão tem sido útil?Da próxima vez que um colega me pergunta por que eu "sempre querer fazer algo assim" eu gostaria de ser mais preparados.

Foi útil?

Solução

Posso uso a seguir para reflexão:

  • Ligação tardia
  • De segurança (introspecção código por motivos de segurança)
  • Análise de código
  • Tipagem dinâmica (duck typing não é possível sem reflexão)
  • Metaprogramming

Algumas mundo real usos de reflexão a partir de minha experiência pessoal:

  • Desenvolveu um sistema de plugins com base na reflexão
  • Usado programação orientada a aspectos do modelo
  • Realizada análise estática de código
  • Usado vários frameworks de Injeção de Dependência
  • ...

A reflexão é uma coisa boa :)

Outras dicas

Eu usei a reflexão para obter informações sobre o método de exceções, log, etc.

string src = MethodInfo.GetCurrentMethod().ToString();
string msg = "Big Mistake";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

em vez de

string src = "MyMethod";
string msg = "Big MistakeA";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

É apenas mais fácil de copiar/colar herança e geração de código.

Eu estou em uma situação onde eu tenho um fluxo de XML chegando sobre o fio e eu preciso instanciar um objeto de Entidade que irá preencher a si próprio a partir de elementos da stream.É mais fácil usar a reflexão para descobrir qual Entidade objeto pode lidar com qual elemento XML que para escrever uma gigantesca e manutenção-pesadelo instrução condicional.Há claramente uma dependência entre o esquema XML e como eu estrutura e o nome de meus objetos, mas me controlo tanto assim não é um grande problema.

Há muitos momentos em que você quer dinamicamente instanciar e trabalhar com objetos, onde o tipo não é conhecido até o tempo de execução.Por exemplo, com OU-mappers ou em uma arquitetura de plugins.Estruturas de simulação usá-lo, se você deseja gravar um log de biblioteca e dinâmica pretende examinar a natureza e as propriedades de exceções.

Se eu acho que um pouco mais de tempo eu provavelmente pode vir até com mais exemplos.

Eu acho reflexão muito útil se os dados de entrada (como xml) tem uma estrutura complexa que é facilmente mapeada para o objeto-instâncias ou eu precisar de algum tipo de "é uma" relação entre as instâncias.

Como a reflexão é relativamente fácil em java, eu às vezes uso ele para dados simples (chave-valor mapas), onde tenho um pequeno conjunto fixo de chaves.Por um lado é simples determinar se uma chave é válida (se a classe tiver um setter setKey(String dados)), por outro lado não pode alterar o tipo de (textual) de entrada de dados e esconder a transformação (e.g simples convertido para int em getKey()), de modo que o resto da aplicação pode confiar corretamente os dados digitados.Se o tipo de chave-valor do par de alterações para um objeto (por exemplo,formulário de int para float), eu só tenho a alterar os dados do objecto e os seus usuários, mas não tem que manter em mente para verificar o analisador também.Isso não pode ser uma abordagem sensata, se o desempenho é um problema...

Escrever os coordenadores.Torcida usa python capacidades reflexivas para envio de XML-RPC e SOAP chamadas.RMI usa Java da api de reflexão para a expedição.

Linha de comando de análise.Construção de um objeto de configuração com base em parâmetros de linha de comando que são passados.

Ao escrever testes de unidade, pode ser útil o uso de reflexão, que, principalmente, eu usei isso para ignorar modificadores de acesso (Java).

Eu usei a reflexão em C# quando havia alguma interno ou método particular no quadro ou uma biblioteca de terceiros, que eu queria para o acesso.

(Isenção de responsabilidade:Não é necessariamente a melhor prática, porque privado e métodos internos podem ser alterados em versões posteriores.Mas ele trabalhou para o que eu precisava.)

Bem, em linguagens estaticamente tipadas, você gostaria de usar uma reflexão qualquer momento, você precisa fazer alguma coisa "dinâmico".Vem a calhar para fins de ferramentas de varredura (os membros de um objeto).Em Java é utilizado em JMX e dinâmico proxies um pouco.E há milhares de casos em que é realmente a única maneira de ir (praticamente a qualquer hora que você precisa fazer algo que o compilador não permitirá que você faça).

Eu geralmente uso a reflexão para depuração.A reflexão pode mais facilmente e com maior precisão exibir os objetos dentro do sistema de uma variedade de instruções de impressão.Em muitas linguagens de primeira classe de funções, você pode até mesmo invocar as funções do objeto sem escrever código especial.

No entanto, há uma maneira de fazer o que você quer(ed).Use um hashtable.Armazenar os campos introduzidos contra o nome do campo.

Se você realmente quiser, você pode, em seguida, criar o padrão Obter/Definir funções, ou criar macros que fazê-lo voar. #define GetX() Get("X") tipo de coisa.

Você pode até mesmo executar suas próprias imperfeito reflexão de que maneira.

Para o usuário avançado, se você pode compilar o código, poderá ser possível activar a saída de depuração geração e que, para realizar a reflexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top