Palavra-chave opens

A palavra-chave opens em Java foi introduzida no Java 9 como parte do Java Platform Module System (JPMS), também conhecido como Project Jigsaw. Ela é usada dentro de uma declaração de módulo para permitir que pacotes específicos de um módulo sejam acessíveis para reflexão, sem necessariamente exportar esses pacotes para outros módulos.

Funcionalidade:

  • A palavra-chave opens é usada para permitir o acesso via reflexão a um pacote específico dentro de um módulo.
  • A diferença entre opens e exports é que exports permite que outros módulos utilizem as classes e membros do pacote de forma pública, mas não permite o acesso via reflexão. opens, por outro lado, não expõe o pacote para uso público direto, mas permite acesso via reflexão.

Sintaxe:





module com.exemplo.meuModulo {
    opens com.exemplo.pacote;
}

Nesse exemplo:

  • O pacote com.exemplo.pacote está aberto para reflexão por outros módulos, mas não está explicitamente exportado para ser utilizado por outros módulos.

Exemplo com uso de opens:





module com.meuModulo {
    opens com.meuModulo.servicos;
}
  • O pacote com.meuModulo.servicos está aberto para reflexão, o que permite que frameworks como Spring ou Hibernate acessem esse pacote dinamicamente em tempo de execução.

Diferença entre opens e exports:

opens:

  • Permite que outros módulos acessem o pacote via reflexão.
  • Não permite que outros módulos acessem diretamente as classes e métodos, exceto via reflexão.

exports:

  • Exporta o pacote para que outros módulos possam acessar suas classes e métodos publicamente.
  • Não permite o uso de reflexão, a menos que o pacote também seja explicitamente aberto com opens.

Abertura condicional:

Também é possível abrir pacotes para reflexão apenas para módulos específicos, usando to.

Exemplo:





module com.exemplo {
    opens com.exemplo.servicos to outroModulo;
}

Aqui, o pacote com.exemplo.servicos está aberto para reflexão apenas para o módulo outroModulo, limitando o escopo de quem pode acessá-lo via reflexão.

Quando usar:

  • Use opens quando você precisar que pacotes sejam acessíveis via reflexão por frameworks ou ferramentas, como Spring, Jackson ou outros frameworks que utilizam reflexão para criar instâncias de objetos, acessar atributos privados ou realizar operações semelhantes.

Em resumo, a palavra-chave opens é essencial quando você deseja permitir que partes de um módulo sejam acessadas via reflexão sem necessariamente exportar o pacote para uso público por outros módulos.