Definições
Reflection é a habilidade de um programa reconhecer a sua estrutura através dos tipos de dados.
Reflection permite que um objecto obtenha informações sobre sua estrutura e sobre os motivos de sua computação.
Usando reflection, os dados sobre a estrutura do programa são inseridos e produzidos automaticamente pelo compilador na forma de meta-dados.
O paradigma de programação por trás dessa capacidade é chamado programação reflexiva.
Usos da Reflection
- Informações de um objecto;
- Criação e modificação de classes, métodos e atributos dinamicamente (em tempo de execução);
- Adaptação do sistema dinamicamente às diferentes situações: carregar novas classes em tempo de execução.
- Auto-otimização ou auto-modificação de um programa: pode ser feito modificando a própria área de memória do programa;
- Criação de ORMs poderosos, combinando com as anotations (anotações)
- Criação frameworks que baseados em injecção de Dependência (Ex: ASP NET Core, Spring e Quarkus);
- Programação genética;
Vantagens
- Ganho de produtividade;
- Extensibilidade da linguagem;
- Substituição um trabalho repetitivo por automação;
Desvantagens
- Complexidade do código;
- Facilidade na introdução de erros e falhas de segurança na aplicação
- Quando usada por excesso, pode reduzir o desempenho da aplicação;
- Sobrecarga da aplicação em tempo de execução.
Observação
As linguagens interpretadas são mais adptadas a trabalhar com reflections. Ex: PHP, Javascript e Python. A estrutura dessas linguagens permite trabalhar dinamicamente com os atributos e métodos de um objecto.
Linguagens compiladas usam o seu ambiente de execução para fornecer informação sobre o código fonte. Em algumas linguagens compiladas, o compilador grava o nome de elementos numa tabela que faz a correspondência desses nomes com os métodos e classes.
Exemplo: Usando a linguagem Go, vamos representar os seguintes problemas:
- Inspecionar um objecto (métodos, atributos, tipos e valores);
- Chamar métodos dinamicamente;
- Verificar se métodos e atributos existem;
- Contar quantos tipos primitivos são chamados por uma função.
*Artigo disponível em: *
https://www.dev.to/ortizdavid
https://www.medium.com/@ortizaad1994
*Código Fonte: *
https://github.com/ortizdavid/reflection-golang