Desde que foi criada, em 1995, a linguagem de programação Java se popularizou rapidamente e se tornou uma das mais utilizadas do mundo. Com o crescente uso da computação em nuvem, que exige aplicações com uma inicialização mais ágil e baixo heap (estrutura de dados especializada) de memória inicial, uma das tendências do mundo Java é o reflectionless, que propõe reduzir os gargalos do pacote reflection.
Ainda não está por dentro de como funciona o reflectionless? Confira, neste post, o que você precisa saber sobre o assunto!
O que é reflection?
Vamos entender primeiro o que é reflection, cuja função é extremamente relevante dentro de muitas ferramentas, que vão desde o JAX-RS (uma API REST) até os clássicos ORM. O mecanismo tem como finalidade facilitar o trabalho dos desenvolvedores Java, pois reduz bastante o boilerplate (trechos de um documento) de várias operações.
Um dos diferenciais do universo Java é exatamente sua gama de ferramentas e ecossistemas relacionados à linguagem de programação. Os usuários finais desses frameworks podem acessar todos os seus recursos de forma simplificada, já que é só inserir anotações na classe, que serão lidas, para que as demais operações sejam executadas.
Nas construções de frameworks atuais, a forma mais comum de efetuar essa leitura é por meio do reflection, que faz uma introspecção que cria uma espécie de linguagem simbólica dentro das operações Java.
Quais são os problemas do reflection?
A adoção da API do reflection para o desenvolvimento de soluções no mundo Java se tornou mais fácil devido à alta disponibilidade de materiais, com documentos, especificamente para essa modalidade de trabalho. Contudo, ainda há algumas dificuldades quanto à inicialização e ao consumo de memória quando se utiliza o reflection.
A primeira dificuldade acontece porque o processamento e a estrutura de dados são feitos no ato da execução. Nesse contexto, é preciso checar cada classe, escopos e dependências — quanto maior o número de classes a serem checadas, mais processamento vai ser exigido, ampliando consideravelmente o tempo de resposta.
Já o segundo problema, o consumo de memória, está atrelado à necessidade de cada classe de ser percorrida para encontrar os metadados presentes no Class, que se caracteriza por ter um cache ReflectionData que carrega os dados da classe. Isso quer dizer que, para acessar uma única informação, o processo acaba carregando todos os metadados e a referencia a partir do SoftReference, que demanda um período bem maior para sair da memória.
Portanto, pode-se dizer que a demora para iniciar a aplicação e o consumo de memória se devem às análises e aos processamentos de parser que são executados assim que a aplicação começa a funcionar.
Como aplicar o reflectionless?
O reflectionless contribui para solucionar os problemas da abordagem reflection. Para tanto, a tendência propõe que os frameworks façam as operações de análises e o processamento durante a compilação, deixando de acontecer na execução. A iniciativa traz as seguintes vantagens:
- todas as estruturas e os metadados já estarão prontos no momento em que a aplicação for iniciada;
- não é necessário chamar as classes do reflection, como a ReflectionData, o que reduz o consumo de memória no processo de inicialização;
- o programador não vai sofrer com o efeito do Type Erasure (Tipo de Apagamento).
Além disso, quando não se usa o reflection, torna-se viável desenvolver um código nativo. Basta utilizar o GraalVM, que é ideal para projetos com o conceito serverless, tendo em vista que o programa é executado somente uma vez e posteriormente faz com que o recurso volte para o sistema operacional.
Como toda inovação que surge na área de programação, o reflectionless também pode ter desvantagem. Isso porque a remoção da aplicação implica perda da otimização do compilador Just-in-Time (JIT). Inclusive, alguns programadores já apontam que o Java Virtual Machine (JVM) pode ser mais eficiente que o código nativo. Logo, sua escolha entre adotar ou não a tendência vai depender das características e dos objetivos do seu projeto.
E aí, gostou deste post? Siga o nosso perfil no LinkedIn e acompanhe mais conteúdos interessantes e curiosos sobre tecnologia!