728x90
λ°μν
π Annotationμ΄λ? (μ΄λ Έν μ΄μ , μ λν μ΄μ )
μ£Όμμ²λΌ νλ‘κ·Έλλ° μΈμ΄μ μν₯μ λ―ΈμΉμ§ μμΌλ©°, μ μ©ν μ 보λ₯Ό μ 곡νλ€.
π Annotation μν
βοΈ μ»΄νμΌλ¬μκ² λ¬Έλ² μλ¬λ₯Ό 체ν¬νλλ‘ μ 보λ₯Ό μ 곡νλ€.
βοΈ νλ‘κ·Έλ¨μ λΉλν λ μ½λλ₯Ό μλμΌλ‘ μμ±ν μ μλλ‘ μ 보λ₯Ό μ 곡νλ€.
βοΈ λ°νμμ νΉμ κΈ°λ₯μ μ€ννλλ‘ μ 보λ₯Ό μ 곡νλ€. (Reflection)
π Annotation μ’ λ₯(νμ€ μ΄λ Έν μ΄μ , λ©ν μ΄λ Έν μ΄μ )
βοΈ νμ€ μ΄λ
Έν
μ΄μ
: μλ°μμ κΈ°λ³Έμ μΌλ‘ μ 곡νλ μ΄λ
Έν
μ΄μ
βοΈ λ©ν μ΄λ
Έν
μ΄μ
: μ΄λ
Έν
μ΄μ
μ μν μ΄λ
Έν
μ΄μ
, μ΄λ
Έν
μ΄μ
μ κ°λ° μ νμ©
βοΈ μ¬μ©μ μ μ μ΄λ
Έν
μ΄μ
: λ©ν μ΄λ
Έν
μ΄μ
μ ν΅ν΄ κ°λ°μκ° μνλ μ΄λ
Έν
μ΄μ
μ μνμ¬ νμ©
π Meta Annotation μ’ λ₯(λ©ν μ΄λ Έν μ΄μ )
π @Target
βοΈ μ΄λ
Έν
μ΄μ
μ μ μ©ν μ μλ λμμ μ§μ μ μ¬μ©
@Target({TYPE, FIELD, METHOD})
public @interface TestAnnotation() {}
π @Retention
βοΈ μ΄λ
Έν
μ΄μ
μ΄ μ μ§(Retention) λλ κΈ°κ°μ μ§μ νλλ° μ¬μ©
@Retention(RetentionPolicy.RUNTIME)
public @interface FunctionalInterface {}
β μλ¬Έμ : SOURCE λ 벨과 CLASS λ 벨μ μ°¨μ΄κ° μμ΄ λ³΄μΈλ€. λκΉ?
둬볡μμ μμ£Ό μ¬μ©νλ @Getter μ @NotNull μ΄λ
Έν
μ΄μ
μ΄ μ‘΄μ¬νλ€.
@Getter λ SOURCE λ λ²¨λ‘ μ μνκ³ , @NotNullμ CLASS λ λ²¨λ‘ μ μνλ€.
λ κΈ°λ₯μ 곡ν΅μ μ JAVAνμΌμ CLASS νμΌλ‘ μ»΄νμΌν λ νΉμ μ½λλ₯Ό μ½μ
νλ€λ κ²μ΄λ€.
νμ§λ§ μ°¨μ΄μ μ΄ μ‘΄μ¬νλλ°,
SOURCE λ 벨μ CLASS νμΌμ μ΄λ
Έν
μ΄μ
μ΄ λ¨μμμ§ μλ€λ κ²μ΄κ³
CLASS λ 벨μ CLASS νμΌμ μ΄λ
Έν
μ΄μ
μ΄ κ·Έλλ‘ μ μ§λλ€λ μ μ΄λ€.
→ CLASS νμΌμ λμ»΄νμΌν΄λ³΄λ©΄ νμΈν μ μλ€
μΆκ°λλ κΈ°λ₯μ κ°κ³ κ·ΈλΌ μΈμ CLASS λ 벨μ μ¨μΌνλκ±ΈκΉ?
→ μ°λ¦¬λ κ°λ°νλ©΄μ λ€μν jar νμΌ, λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬ν¨νμ¬ κ°λ°μ μ§ννλ€.
λΌμ΄λΈλ¬λ¦¬λ λλΆλΆ jar νμΌλ‘ κ΄λ¦¬λκ³ μκ³ , ν΄λΉ jarνμΌμ javaνμΌμ΄ μλλΌ class νμΌλ€λ§ λͺ¨μ¬μλ€.
μ΄λ
Έν
μ΄μ
μ νμ©νμ¬ κΈ°λ₯μ ꡬνν λΌμ΄λΈλ¬λ¦¬λ€μ μ¬μ©νλ©΄μ IDEμ κ²½κ³ λ©μμ§, νμ
μ²΄ν¬ λ±μ μ¬μ©νκΈ° μν΄μ CLASS μ μ±
μ΄ νμν κ²μ΄λ€.
π @Inherited
βοΈ μμ ν΄λμ€μ μμνκ³ μ ν λ μ¬μ©
@Inherited
public @interface TestAnno() {}
@TestAnno
class Parent {}
class Child extends Parent {} // Childμ μ΄λ
Έν
μ΄μ
μ΄ λΆμκ±Έλ‘ μΈμ
π @Repeatable
βοΈ λ°λ³΅ν΄μ λΆμΌ μ μλ μ΄λ
Έν
μ΄μ
μ μ μν λ μ¬μ©
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Todos {
Todo[] value();
}
@Repeatable(Todos.class)
public @interface Todo {
String value() default "";
}
@Todo("μ§ κ°κΈ°")
@Todo("λΉ¨λ νκΈ°")
class MyClass {}
π @Documented
βοΈ javadocμΌλ‘ μμ±ν λ¬Έμμ ν¬ν¨μν€λ €λ©΄ μ¬μ©
π μ¬μ©μ μ μ Annotation (RUNTIME)
public class Anno {
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Todos {
Todo[] value();
}
@Repeatable(Todos.class)
public @interface Todo {
String value() default "";
int num();
}
@Todo(value = "μ§ κ°κΈ°", num = 0)
@Todo(value = "λΉ¨λ νκΈ°", num = 1)
class MyClass {
}
public static void main(String[] args) {
Annotation[] annotations = MyClass.class.getDeclaredAnnotations();
// Annotation[] annotations = MyClass.class.getAnnotations();
for (Annotation i : annotations) {
if (i instanceof Todos) {
Todos todos = (Todos) i;
for (Todo todo : todos.value()) {
System.out.println(todo.num() + " : " + todo.value());
}
}
}
}
}
// μΆλ ₯
0 : μ§ κ°κΈ°
1 : λΉ¨λ νκΈ°
β getDeclaredAnnotations() vs getAnnotations()
→ getDeclaredAnnotations : μμ μ΄λ
Έν
μ΄μ
(@inherited) μ μΈνκ³ κ°μ Έμ΄
→ getAnnotations() : λ€ κ°μ Έμ΄
π μ¬μ©μ μ μ Annotation (SOURCE, CLASS)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
@Getterλ‘ μμλ₯Ό λ€λ©΄ μ§μ JAVA νμΌμλ getter() λ©μλλ₯Ό μμ±νμ§ μμμ§λ§, μ΄λ
Έν
μ΄μ
μ μ§μ μ ν΅ν΄ μλμ μΌλ‘ μΆκ°λμ΄ μ¬μ©ν μ μλ€. ν΄λΉ μ리λ μ»΄νμΌ μμ μ μλλ λμμ μ½μ
νλ κ²μ΄λ€.
μ»΄νμΌμμ μ getterλ©μλλ₯Ό μΆκ°ν΄μ£ΌκΈ° μν΄μ Annotation Processor λΌλ κ²μ νμ©νλ©΄ λλ€.
RUNTIME λ λ²¨μ΄ λ°νμμ 리νλ μ
μ ν΅ν΄ μ΄λ
Έν
μ΄μ
μ νΈλ€λ§νλ€λ©΄, SOURCE, CLASSλ μ»΄νμΌ μμ μ Annotation Processorλ₯Ό ν΅ν΄ νΈλ€λ§νλ κ²μ΄λ€.
728x90
λ°μν
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java/Spring] File λλ ν°λ¦¬(ν΄λ)κ° μμ±λμ§ μλ μ΄μ[mkdir(), mkdirs()] (0) | 2024.06.27 |
---|---|
[νλ‘κ·Έλλ¨Έμ€/JAVA] μ΄μν μΉΈ (0) | 2024.02.03 |
[JAVA] Date -> Calendar, Calendar -> Date λ³ννκΈ° (0) | 2023.11.15 |
[Java] PKIX path building failed λ¬Έμ ν΄κ²° λ°©λ² (0) | 2023.11.07 |
[Java] λ¨μΆ νκ°, μ’μ ifλ¬Έμ μμ±νλ λ°©λ² (2) | 2022.11.19 |
λκΈ