Annotaion 처리부 구현 (값 주입, Trim)Back-end/Java, Kotlin2021. 4. 27. 23:26
Table of Contents
[Object].getClass()
: 해당 클래스의 인스턴스를 만들 때 필요한 정보를 리턴한다.
.getClass() 와 .class는 비슷한 역할을 하는 것으로 보이는데,
두 개의 차이는
전자는 RunTime에 결정되고 후자는 CompileTime 에 결정된다고 한다.
아래는 구현부이다 ! 리펙터링이 필요하지만.. 오늘은 다메다메..
값 주입
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectionNumber {
int data() default -1;
}
public class Target {
@InjectionNumber(data = 1234) int a;
int b = 123000;
String c;
}
public class Main {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{
Target target = new Target();
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
if(field.getType() == int.class && field.isAnnotationPresent(InjectionNumber.class)) {
InjectionNumber anno = field.getAnnotation(InjectionNumber.class);
int annoValue = anno.data();
field.set(target, annoValue);
}
}
System.out.println("myHello.a = " + target.a);
System.out.println("myHello.a = " + target.b);
}
}
실행결과
myHello.a = 1234
myHello.a = 123000
** field.getInt(new Target()) -를 하면 해당 필드값을 가져올 수 있다.
Trim
이건 사수형님의 idea로 한번 구현해본 것이다.
멤버변수(필드)에 @Trim 이 붙어 있으면 trim 기능을 해주는 애노테이션이다.
@Retention(RetentionPolicy.RUNTIME)
public @interface Trim { }
public class Target {
@Trim public String a = "Hello"; // 일반 문자열
@Trim public String b = " Hello "; // 공백이 있는 문자열
public String c; // 아무 값이 없는 문자열
}
public class Main {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{
Target target = new Target();
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
if(field.getType() == String.class && field.isAnnotationPresent(Trim.class)) {
// field.setAccessible(true);
String fieldValue = (String) field.get(target);
field.set(target, fieldValue.trim());
}
}
System.out.println("target.a = " + target.a);
System.out.println("target.b = " + target.b);
}
}
실행결과
target.a = Hello
target.b = Hello
접근할 필드가 private이라면 setAccessible 메서드로 허용할 수 있다.
다음으로는 ..
IoC 컨테이너의 Bean과 Autowired 처럼
Bean을 생성해주고 값을 주입받는 애노테이션을 한번 만들어보고자 한다 !
'Back-end > Java, Kotlin' 카테고리의 다른 글
Java ZoneDateTime 에 대해서 (0) | 2023.05.08 |
---|---|
Thread에 대한 것들 (0) | 2021.07.14 |
Reflection : 그누므 리플렉션이 모야 !! (ft. 애노떼이숀, 쩨네릭) (0) | 2021.04.08 |
[디자인 패턴] Observer (0) | 2021.03.29 |
[디자인 패턴] Strategy (ft. 오바와치) (0) | 2021.03.27 |
@philo0407 :: Philo의 다락방
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!