O que é «reflexão» na programação?

A programação reflexiva é um mecanismo que possibilita um processo de habilidades introspectivas. As APIs de reflexão incorporadas às linguagens de programação permitem que você inspecione seu código em tempo de execução. Você pode usar essa capacidade para aprender sobre a base de código circundante e seu conteúdo.

A reflexão é frequentemente discutida no contexto da programação orientada a objetos. A reflexão é frequentemente usada para descobrir entidades de base de código em tempo de execução. A API de reflexão da linguagem permitirá que você inspecione classes, métodos, propriedades e tipos em seu sistema. Isso permite que você crie uma funcionalidade mais dinâmica.

Sistemas que usam reflexão podem interrogar e modificar seus ambientes. É aqui que a reflexão difere da mera introspecção de valor. Uma linguagem com suporte total à reflexão permitirá a modificação da base de código em tempo de execução, permitindo efetivamente que a fonte reescreva aspectos de si mesma.

índice

  1. Um exemplo de reflexão
  2. Use reflexão com valores imprevisíveis
  3. Reflexão, compilação e montagem
  4. declarações de avaliação
  5. Conclusão

Um exemplo de reflexão

Um uso comum de reflexão é durante o teste. A reflexão pode ajudá-lo a simular as aulas, expondo seus comportamentos internos. Um método de classe protected ou private normalmente não seria testável; usando reflexão, você pode substituir a restrição de visibilidade para que ela se torne public em seus testes de unidade.

 class Teste { protected int $Value ; public function __construct (int $Value) { $this -> Valor = $Value; } função protegida computeValue() : int { return ( $this -> Value * 2 ); } } /** * Sem Reflexão */ $t = new Test(10); // Erro - o método não é acessível publicamente assert ( $t -> computeValue() === 20 ); /** * Usando Reflection */ $reflectionMethod = new ReflectionMethod( Test :: CLASS , "computeValue" ); $reflectionMethod -> setAccessible( true ); $t = novo Teste (10); // Isso agora funciona! assert ( $reflectionMethod -> invocar ( $t ) === 20 );

Neste exemplo usando PHP, a classe Test define um método protected usado internamente. Como o método está executando um cálculo, você pode querer testá-lo de unidade. Você não pode chamar o método externamente, mas a API Reflection do PHP permite que você ignore as restrições de visibilidade. Uma instância de ReflectionMethod fornece informações sobre o método e permite que você recupere uma versão modificada.

Embora isso seja útil, você deve estar ciente de que pode ser mal utilizado. O uso generalizado de reflexão em testes geralmente indica problemas maiores em sua base de código. Isso implica que a interface de classe é muito restritiva e inadequada para suas responsabilidades. Em muitos casos, é mais apropriado refatorar o método protegido em uma nova classe que exponha sua própria interface pública.

É assim que pode ficar para o exemplo mostrado acima:

 class Calculator { public function computeValue() : int { return ( $this -> Value * 2 ); } } class Test { protected int $Value; protectedCalculator $Calculator ; public function __construct(int $Value, Calculator $Calculadora) { $this -> Valor = $Value; $this -> Calculadora = $Calculadora ; } }

O componente calculadora agora é uma unidade autônoma com uma interface pública verificável. Isso anda de mãos dadas com a injeção viciante: a classe Test agora recebe uma Calculator que implementa a lógica de cálculo.

Use reflexão com valores imprevisíveis

A reflexão também é útil ao escrever código genérico em uma estrutura. Pode ser necessário interagir com tipos fornecidos pelo usuário que você não pode prever. A reflexão pode ajudar quando você não conhece os métodos e as propriedades que um tipo exibe.

Você pode obter uma imagem da funcionalidade do tipo sem nenhum conhecimento prévio de sua origem. Isso é útil no contexto de componentes de registro e relatório de erros que podem querer fazer download da lista de membros de qualquer classe para a qual tenham passado.

Os sistemas de classificação de dados também são frequentemente implementados dessa maneira. Imagine um empacotador fazendo uma aula e convertendo-a em uma representação JSON. Você pode definir uma convenção que qualquer método prefixado com get e terminando com Json (por exemplo getUserJson() ) deve ser chamado pelo empacotador e adicionado à sua saída. A reflexão fornece o mecanismo para obter a lista de métodos. Em seguida, você implementaria a lógica para identificar quais chamar.

Reflexão, compilação e montagem

O Reflection fornece funcionalidade adicional em linguagens compiladas que usam bibliotecas e assemblies vinculados. As APIs de reflexão permitem que você inspecione o conteúdo de assemblies carregados. Em linguagens como C#, assemblies adicionais podem ser carregados dinamicamente usando a API Reflection.

Essa abordagem pode ser útil se você estiver implementando um sistema de plug-in com assemblies fornecidos pelo usuário. Seu programa não saberá quais plugins estão disponíveis quando for compilado. Toda vez que ele é iniciado, ele deve verificar o sistema de arquivos para assemblies de plug-ins disponíveis. Uma vez que um plugin é encontrado, o Reflection fornece um mecanismo para carregar e instanciar seus membros.

Você pode inspecionar o plug-in, encontrar as classes que ele fornece e registrá-lo em seu aplicativo. Uma inspeção adicional da montagem pode fornecer o nome e a versão do plug-in a serem exibidos nos logs e na interface do usuário.

A reflexão também pode ser usada para trocar montagens com base na configuração externa. Digamos que você esteja escrevendo um aplicativo que salva arquivos de imagem na memória. você pode ter um LocalStorageDriver , FtpStorageDriver é AmazonS3StorageDriver , cada um contido em seu próprio conjunto (um C# .dll ).

Usando reflexão, você pode fornecer uma chave de "driver de armazenamento" no arquivo de configuração do sistema. O assembly apropriado será carregado dinamicamente com base no valor do arquivo de configuração. Ele inspecionará o assembly para descobrir qual classe implementa sua própria interface StorageDriver .

Essa abordagem permite substituir componentes do sistema em tempo de execução. Não há necessidade de recompilar ou reiniciar o programa para alternar entre assemblies. Isso oferece maior flexibilidade e facilita a implementação de políticas de configuração.

declarações de avaliação

A reflexão está intimamente relacionada com a eval . Muitas linguagens de programação fornecem uma maneira de executar valores de string dinâmicos como código-fonte.

Eval é uma permutação de reflexão com poder quase ilimitado. Ele permite que você crie e execute um novo código dentro de um programa ao vivo. Isso representa um problema de segurança potencialmente catastrófico se a entrada do usuário for inserida eval rope.

Uma instrução eval deve ser usada quando você não tiver outras opções. Você deve garantir que a instrução seja executada em um contexto limitado que os usuários não possam aproveitar. Lembre-se de que uma injeção de código bem-sucedida daria ao invasor os mesmos poderes que o código de aplicativo normal.

Conclusão

A reflexão é uma técnica de programação que fornece recursos introspectivos para codificar. O uso eficaz da reflexão permite que você escreva sistemas mais dinâmicos e se beneficie de uma maior automação. Você também pode usar a reflexão para testar o código privado inacessível.

É preciso cautela. APIs de reflexão em linguagens de programação são poderosas, então as responsabilidades vêm com elas. O maior problema é a capacidade da reflexão de subverter as proteções fornecidas pela sua linguagem de programação.

A reflexão permite cenários impossíveis, como escrever sobre variáveis ​​imutáveis ​​e uso público generalizado de métodos privados. Você deve poder confiar que seu código obedecerá às regras do seu idioma. Portanto, o uso da API de reflexão deve ser cuidadosamente considerado e limitado a seções específicas do sistema.

  • Como emparelhar o controle remoto Rokuku
  • Novos fones de ouvido Soundcore Life P3 enlouquecem com recursos, apesar de um preço de US $ 80 – Revisão Geek

descubra mais conteúdo

O que é um amplificador integrado?

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão Geek

Deixe uma resposta Cancelar resposta

A reflexão é a mudança de direção de uma onda quando ela entra em contato com a superfície que separa dois meios diferentes.

Qual é o significado da reflexão?

entrada Pensar com cuidado e cuidado sobre algo. Você precisa pensar sobre o problema. U. 3 dias atrás

O que é uma reflexão e um exemplo?

Alguns exemplos de reflexão da luz são os seguintes: Os reflexos da luz do sol nas paredes, quando atinge a tela polida de um celular ou de um relógio de pulso. A possibilidade de nos vermos em um espelho, cuja superfície altamente polida permite que os feixes de luz sejam devolvidos aos nossos olhos.

O que é reflexo no ser humano?

A reflexão humana tenta buscar explicações dos eventos, ou seja, conhecer as causas (admitindo a causalidade), caso sejam úteis para evitá-los (evitar efeitos perniciosos) ou reproduzi-los (procurar efeitos adequados).

Ir arriba