Java pre-processing and annotations talk. How to do it? How it works? Why to do it?
Github code: https://github.com/luanpotter/annotation-preprocessing
https://github.com/luanpotter/reflection-utils
27. Annotations - Elements
@MyShinyAnnotation
@MyShinyAnnotation() : todos os elements são obrigatórios (salvo default)
@MyShinyAnnotation(value = "a")
@MyShinyAnnotation("a")
@MyShinyAnnotation(value = "a", intValue = 7)
@MyShinyAnnotation("a", intValue = 7)
28. Annotations - Elements
@MyShinyAnnotation
@MyShinyAnnotation() : todos os elements são obrigatórios (salvo default)
@MyShinyAnnotation(value = "a") : ok
@MyShinyAnnotation("a") : ok
@MyShinyAnnotation(value = "a", intValue = 7)
@MyShinyAnnotation("a", intValue = 7)
29. Annotations - Elements
@MyShinyAnnotation
@MyShinyAnnotation() : todos os elements são obrigatórios (salvo default)
@MyShinyAnnotation(value = "a") : ok
@MyShinyAnnotation("a") : ok
@MyShinyAnnotation(value = "a", intValue = 7) :ok
@MyShinyAnnotation("a", intValue = 7)
30. Annotations - Elements
@MyShinyAnnotation
@MyShinyAnnotation() : todos os elements são obrigatórios (salvo default)
@MyShinyAnnotation(value = "a") : ok
@MyShinyAnnotation("a") : ok
@MyShinyAnnotation(value = "a", intValue = 7) :ok
@MyShinyAnnotation("a", intValue = 7) : nok
32. Annotations - Uses
Documentação - Evolução Javadoc
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
public class MyPojo { /* ... */ }
33. Annotations - Uses
Documentação - Evolução Javadoc
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
public class MyPojo { /* ... */ }
@ClassPreamble(
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
reviewers = { "Alice", "Bob", "Cindy" }
)
public class MyPojo { /* ... */ }
34. Annotations - Uses
Documentação - Evolução Javadoc
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
public class MyPojo { /* ... */ }
@ClassPreamble(
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
reviewers = { "Alice", "Bob", "Cindy" }
)
public class MyPojo { /* ... */ }
➔ Easily ‘parseable’!
➔ Standardized!
➔ Type safe!*
*Well, sort of…
➔ Required (compile errors)
48. Annotations - Limitations
★ Valid element types
String Primitives
Enums Annotations
Class Arrays of those
>> Use enum’s or String’s
➔ Date -> String
➔ Comparator -> ComparatorType [could be a Class here too]
>> Use other annotations to group fields
>> But no generic enum nor annotation! [Enum, Annotation]
75. Annotation Preprocessing
➔Como funciona?
◆ Preprocessors extend AbstractProcessor
◆ Implementam os métodos usando uma API análoga
a de Reflection
◆ Registram-se no META-INF
◆ javac sobe uma vm e roda os processadores
registrados em turnos
80. Annotation Preprocessing
➔Na prática
◆ ✓ Baixe o jar da biblioteca e coloque no classpath
do javac
◆ ✓ Adicione a dependência no maven/gradle/etc
➔Precisa ser uma lib separada [META-INF]
➔Precisa habilitar annotation preprocessing
em algumas IDEs (javac faz por padrão)
81. Annotation Preprocessor
➔Possibilidades
◆ Análise de código (dar erros e warnings...)
◆ Gerar métodos, campos, classes, qualquer coisa
➔Limitações
◆ Triggerado por annotations [processamento em
rodadas]
➔“Problemas”
◆ Excessivamente poderoso
84. Annotation Preprocessing
➔Extremamente poderoso!
◆ With great power comes great responsibility
➔API razoavelmente feia
➔Podemos juntar com Reflection
◆ Preprocess in compile-time
◆ Reflection in run-time
➔Possibilidades são infinitas
[DanDan]
SafeVarargs-> falar para o compilador que quando usar metodo com bla(T… asd) ignorar o aviso de problema
[DanDan]
SafeVarargs-> falar para o compilador que quando usar metodo com bla(T… asd) ignorar o aviso de problema
[DanDan]
FunctionalInterface -> Criacao de uma interface para lambdas
Essas são todas as annotations do JDK, exceto as relacionadas à criação de annotations
[Luan]
[Luan]
they are interfaces!
[Luan]
[Luan]
[Luan]
[Luan]
RetentionPolicy.SOURCE: Discard during the compile. These annotations don't make any sense after the compile has completed, so they aren't written to the bytecode. Example: @Override, @SuppressWarnings
Server somente para documentacao, na compilacao sera jogada fora
[Luan]
RetentionPolicy.CLASS: Discard during class load. Useful when doing bytecode-level post-processing. Somewhat surprisingly, this is the default.
Não deixar vc acessar por reflection e runtime e nem por pre-processamento, so serve para libs que altera direto o bytecode
[Luan]
RetentionPolicy.RUNTIME: Do not discard. The annotation should be available for reflection at runtime. Example: @Deprecated
Esta sempre disponivel inclusive em runtime, reflection e preprocessamento.
[Luan]
[Luan]
Target -> Onde pode usar a annotation
[Luan]
they are interfaces!
[Luan]
Type = qualquer declaracao de tipo
[Luan]
import static ElementType!
[Luan]
Se ela tiver o @Documented no javadoc ela vai continuar la
[Luan]
Inherited = Herdado, hereditario
Se classe pai com @Bla, e bla for @Inherited, seus filhos vao ter essa annotation
[Luan]
@Repeatable -> poder repetir a msm annotaiton em um uso.
[Luan]
[Luan]
Sao metodos, mas em particular chamamos de elementos
[Luan]
Quem ai saberia dizer quais funcionam e quais não e pq?
[Luan]
they are interfaces!
[Luan]
[Luan]
[Luan]
Explicar o pq o ultimo não vai dar ce
[DanDan]
[DanDan]
[DanDan]
[DanDan]
[DanDan]
[DanDan]
Git serve para resolver o problema da annotation de documentacao.
[DanDan]
[DanDan]
Duas annotation de 100% de documentacao, não sao runtime.
[DanDan]
Quando usamos as annotations em runtime para definir o comportamento da aplicacao
Assim podemos evitar o uso de XMLs
[DanDan]
Injeccao de dependencias, @Entites,
[DanDan]
Injeccao de dependencias, @Entites,
[DanDan]
[DanDan]
[DanDan]
[DanDan]
[DanDan]
[DanDan]
Type safe limitado a esses seis tipos: String, enums, class, primitivies, annotations, arrays of those
Pq inicialmente as annotations deveriam ser usadas para documentacao,
Deve usar valores constantes, não temo como usar uma instancia de alguma classe com valor constante.
Annotation nunca deve rodar um codigo!
[DanDan]
Class não pode ser Generics!
[DanDan]
[DanDan]
O valor deve ser uma constante de compilacao, o uso da annotation nunca pode rodar um codigo
[DanDan]
[DanDan]
[DanDan]
[DanDan]
Pode somar strings entre coisas que sao constatnes
[DanDan]
Apenasr do array ser static final os elementos dele não sao constantes, em algum lugar fazer myValues[0] = “ASDSDA”
[DanDan]
[DanDan]
Uma annotation não herdar com outra,
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
[Luan]
O ElementType.TYPE_PARAMETER indica que a anotação pode ser usada na declaração de tipos, tais como: classes ou métodos com generics ou ainda junto de caracteres coringa em declarações de tipos anônimos. O ElementType.TYPE_USE indica que a anotação pode ser aplicada em qualquer ponto que um tipo é usado, por exemplo em declarações, generics e conversões de tipos (casts).