Pergunta

Qual é o propósito das anotações em Java?Tenho uma ideia confusa deles como algo entre um comentário e o código real.Eles afetam o programa em tempo de execução?

Quais são seus usos típicos?

Eles são exclusivos do Java?Existe um equivalente em C++?

Foi útil?

Solução

As anotações são usadas principalmente por código que inspeciona outro código.Eles são frequentemente usados ​​para modificar (ou seja,decorar ou embrulhar) classes existentes em tempo de execução para mudar seu comportamento.Estruturas como JUnit e Hibernar use anotações para minimizar a quantidade de código que você precisa escrever para usar as estruturas.

Oráculo tem uma boa explicação do conceito e seu significado em Java em seu site.

Outras dicas

Além disso, eles são exclusivos do Java. Existe um equivalente em C++?

Não, mas VB e C# têm atributos que são a mesma coisa.

Seu uso é bastante diversificado.Um exemplo típico de Java, @Override não tem efeito no código, mas pode ser usado pelo compilador para gerar um aviso (ou erro) se o método decorado não substituir realmente outro método.Da mesma forma, os métodos podem ser marcados como obsoletos.

Depois há reflexão.Ao refletir um tipo de classe em seu código, você pode acessar os atributos e agir de acordo com as informações ali encontradas.Não conheço nenhum exemplo em Java, mas em .NET isso é usado pelo compilador para gerar (des)serialização informações para as aulas, determine o layout de memória de estruturas e declarar importações de função de bibliotecas legadas (entre outras).Eles também controlam o funcionamento do designer de formulários IDE.

/EDITAR:Os atributos nas classes são comparáveis ​​às interfaces de tags (como Serializável em Java).No entanto, as diretrizes de codificação do .NET dizem para não usar interfaces de tags.Além disso, eles funcionam apenas no nível da classe, não no nível do método.

Anders dá um bom resumo e aqui está um exemplo de anotação JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Aqui o @Test anotação está dizendo ao JUnit que o flatfileMissing método é um teste que deve ser executado e que o resultado esperado é lançado IOException.Assim, quando você executar seus testes, esse método será chamado e o teste será aprovado ou reprovado dependendo se um IOException é jogado.

Java também possui a Annotation Processing Tool (apt), onde você não apenas cria anotações, mas também decide como essas anotações funcionam no código-fonte.

Aqui é uma introdução.

Para ver algumas coisas legais que você pode fazer com as anotações, confira minhas anotações JavaBean e processador de anotações.

Eles são ótimos para gerar código, adicionar validações extras durante sua construção, e também os tenho usado para uma estrutura de mensagens de erro (ainda não publicada - preciso esclarecer com os chefes...).

Por definição literal, uma anotação adiciona notas a um elemento.Da mesma forma, as anotações Java são tags que inserimos no código-fonte para fornecer mais informações sobre o código.As anotações Java associam informações ao elemento do programa anotado.Além das anotações Java, os programas Java possuem uma grande quantidade de documentação informal que normalmente está contida em comentários no arquivo de código-fonte.Porém, as anotações Java são diferentes dos comentários, pois anotam os elementos do programa diretamente usando tipos de anotação para descrever a forma das anotações.As anotações Java apresentam as informações de forma padrão e estruturada para que possam ser utilizadas de maneira adequada pelas ferramentas de processamento.

Para ler em detalhes, há um bom tutorial sobre Anotações Java

Quando você usa a anotação @Override do Java e por quê?O link refere-se a uma pergunta sobre quando se deve usar a anotação de substituição(@override).Isso pode ajudar a entender melhor o conceito de anotação. Confira.

Anotações quando se trata de EJB é conhecida como a escolha da abordagem implícita do meio de médio por causa de uma abordagem explícita de meio, quando você usa a anotação, está personalizando o que precisa exatamente da API, por exemplo, você precisa chamar o método de transação para uma transferência bancária :sem usar anotação:o código será

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

Ao usar a anotação, seu código não contém chamadas de API complicadas para usar os serviços do meio da Ware.O código é limpo e focado na lógica de negócios

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}

Anotações, uma forma de metadados, fornece dados sobre um programa que não faz parte do programa em si.As anotações não têm efeito direto na operação do código que anotam.

As anotações têm vários usos, entre eles:

  • Informações para o compilador — As anotações podem ser usadas pelo compilador para detectar erros ou suprimir avisos.
  • Processamento em tempo de compilação e tempo de implantação — As ferramentas de software podem processar informações de anotação para gerar código, arquivos XML e assim por diante.
  • Processamento em tempo de execução — Algumas anotações estão disponíveis para serem examinadas em tempo de execução.

O escopo de visibilidade é definido por java.lang.annotation.RetentionPolicy constantes SOURCE, CLASS, e RUNTIME

  • RetentionPolicy.SOURCE:A anotação estaria disponível no código fonte do programa e pode ser usada pelo compilador ou apto para geração de código.
  • RetentionPolicy.CLASS:A anotação estaria no arquivo .class, mas não estaria disponível em tempo de execução.Usado por ferramentas de manipulação de código de bytes, como ASM faça as modificações
  • RetentionPolicy.RUNTIME:A anotação estaria disponível no arquivo .class e em tempo de execução, para inspeção via reflexão java via getAnnotations().
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top