Reflexão (programação)

Question book-4.svg
Esta página ou secção cita fontes confiáveis e independentes, mas que não cobrem todo o conteúdo, comprometendo a sua verificabilidade(desde abril de 2015). Por favor, mais referências inserindo-as no texto. Material sem fontes poderá ser removido.
Encontre fontes: Google (notícias, livros e acadêmico)

Em ciência da computação,

A programação reflexiva, também chamada de programação orientada à reflexão, é usada para escrever programas no paradigma reflexivo. Este, é usado como uma extensão para o paradigma da orientação a objeto, para adicionar auto-otimização e aumentar a flexibilidade de um aplicativo. Nesse paradigma a computação não é trabalhada somente durante a compilação do programa, mas também durante sua execução. Outras abordagens imperativas, tais como os paradigmas da programação procedural ou orientada a objeto, especificam que há uma sequência pré estabelecida de operações (sejam elas funções ou chamadas de métodos), que modificam qualquer dado a elas submetido. Por outro lado, o paradigma reflexivo diz que as operações não são definidas em tempo de compilação, e sim, que seu fluxo será decidido dinamicamente, baseado nos dados ao qual terá que trabalhar, e nas operações que devem ser realizadas. O programa só conterá mecanismo de como identificar esses dados e como decidir que operações ele deve realizar.

Qualquer computação pode ser classificada entre atômica, em que a operação completa num passo simples e lógico (como na adição de dois números), ou composta, definida como uma sequência de múltiplas operações atômicas. Um grupo de instruções composto, na linguagem procedural ou orientada a objeto, perde sua estrutura quando compilado. Mas o paradigma reflexivo introduz o conceito de metainformação, que mantém o conhecimento sobre essa estrutura. Essa metainformação armazena dados como o nome dos métodos, nome da classe, nome das superclasses ou até mesmo sobre a suposta funcionalidade do código. O último é obtido mantendo informações sobre as trocas de estados que o código causa nos dados que o percorrem. Assim, quando um dado (ou objeto) é encontrado, ele pode ser refletido para encontrar quais operações ele suporta e, aquela que causa a transição de estado desejada pode ser decidida em tempo de execução, sem a necessidade de ser especificada previamente no código.

Usos da reflexão

A reflexão pode ser utilizada para auto-otimização ou auto-modificação de um programa. Um sub-componente reflexivo de um programa monitorará a execução e poderá otimizar-se ou modificar-se de acordo com a função que o programa está resolvendo. Isso pode ser feito modificando a própria área de memória do programa, onde o código está armazenado.

A reflexão pode ser também utilizada para adaptar um determinado sistema dinamicamente à diferentes situações. Considere, por exemplo, uma aplicação que use uma classe X para comunicar-se com algum serviço. Agora, suponha que essa aplicação precise comunicar-se com um serviço diferente, usando a classe Y, que tem nomes de métodos diferentes. Sem reflexão, a aplicação teria de ser modificada e recompilada. Mas, se a reflexão for usada, isso pode ser evitado. A aplicação poderia conhecer os métodos da classe X e essa classe lhe diria que método era usado para que propósito. Assim, quando um novo serviço for usado, via classe Y, a aplicação também procuraria pelos métodos necessários e os utilizaria. Nenhuma modificação no código seria necessária. Nem mesmo o nome da nova classe deveria ser recompilado com a aplicação, uma vez que ele poderia estar armazenado em algum arquivo de configuração, ser verificado e ter a sua classe carregada em tempo de execução. Esse mecanismo é conhecido comumente como plugin.

No modelagem orientada a objeto, a reflexão é uma parte natural do idioma diário. Quando verbos (métodos) são chamados, várias variáveis como verb (nome do verbo sendo evocado) e this (objeto no qual o verbo é chamado) são populadas para determinar o contexto da chamada. A segurança tipicamente é gerenciada acessando a pilha de execução através de programação. Como callers() retorna uma lista de métodos que a partir do qual método atual foi eventualmente evocado, realizar testes em callers()[1] (o comando evocado pelo próprio usuário) permite ao verbo proteger a si mesmo contra uso não-autorizado.

En otros idiomas