ㅁ getDeclaredXXXXX() - 위 메소드들은 상속받은 것들도 반환하지만 이런 메소드들은 해당 클래스 소스에 정의된 것들만 반환합니다. 예를 들어 getField 로는 private 프로퍼티를 가지고 올 수 없지마녀 getDeclaredField 로는 private 프로퍼티에 접근할 수 있습니다. (이거 찾느라 쪼끔 고생을...)
java.lang.reflect.Method 메소드 클래스 입니다.
ㅁ getModifires() - 메소드의 접근 지정자를 반환 (private, protected, public ...)
ㅁ getParameterTypes() - 메소드 파라미터의 타입을 반환합니다.
ㅁ ★★ invoke(Object obj, Object... args) - 메소드를 실행시킵니다. 첫번째인자는 실행을 할 객체를 넘겨주고 두번째 인자부터는 메소드의 파라미터를 주르륵... 제일 중요한 메소드죠 ㅋㅋㅋ
java.lang.reflect.Field ... 설명은 따로 안해도..
ㅁ get(Object obj) - public 프로퍼티의 값을 가지고 올 때 사용합니다. 접근만 할 수 있다면 프로퍼티 값을 얻어올 수 있습니다.
위의 메소드들만 알고 있어도 어노테이션 가지고 노는데는 충분합니다. 이클립스에서 contents assist 를 이용하면 필요한 메소드들을 확인가능!!!!
2006 년에 회사 프로젝트로 xml 파싱하는게 있었는데 그 때 처음 써봤던 어노테이션...
reflection 과 함게 반복적인 코드들을 자동화 시킬 수 있는 콤보를 보여주신다.
일단 해볼 것은 toString 메소드 자동화를 해보려고 한다.
프로퍼티의 값을 설정하고 출력 테스트를 해보려면 각 클래스마다 toString 을 오버라이딩 해야하는데
귀찮은 건 딱 질색이므로... 일단 고고싱..
ㅁ PrintToString - Annotation
간단하게 설명 들어갑니다. @Retention 의 설명을 아래와 같다.
Indicates how long annotations with the annotated type are to be retained.
해석을 하자면 ... 안되겠다. 그냥 언제까지 어노테이션이 유지되는지를 설정한다.
속성으로는 RetentionPolicy.RUNTIME, CLASS, SOURCE 가 있다. 런타임에서 가지고 놀 것이므로
RUNTIME 을 선택!!
@Target <<< javadoc 은 아래와 같이 설명을 해준다.
Indicates the kinds of program element to which an annotation type is applicable.
어떤 종류의 어노테이션이냐 라는 것을 설정하는 것이다. 하나의 값을 설정해도 되고 여러개를 설정해도 된다.
속성의 종류는 ElementType.FIELD, TYPE, METHOD, PARAMETER, LOCAL_VARIABLE,
CONSTRUCTOR, PACKAGE 가 있다. 여기서는 프로퍼티에 설정할 것이므로 FILED 로 낙찰...
ㅁ 헬퍼 클래스들...
ToStringHelper 클래스는 toString 의 조작에 도움을 주는 클래스이며, BeansHelper 는 자바빈의
getter, setter 메소드를 가지고 오는데 사용합니다. (사실 어딨는지 몰라서 그냥 만든거임..)
기존방식은 모델에 프로퍼티를 하나 추가하게 되면 IPropertySource 를 구현한 곳에서 PropertyDescriptor 를 추가 하고 getPropertyValue 와 setPropertyValue 를 수정해야하는 귀찮은 작업을 처리해야 합니다. 그리고 보기에도 좋지 않습니다. 큰 맘 먹고 어노테이션 과 리플렉션 을 이용하여 자동화를 처리하였습니다. (프로퍼티가 얼마나 추가될지 모르는 상황이기에... 퍼포먼스 따위는 하드웨어에게 양도...)
기존의 소스...
자동화 처리된 소스...
프로퍼티 상수에 PropertyDescription 어노테이션을 정의하여 PropertySourceHelpers 에 처리를 위임합니다. 알아서 PropertyDescriptor 들을 반환해주고 값을 얻어오고 설정을 하게 됩니다.
기존 방식은 한 두개야 머 저렇게 작업하겠지만 몇 십개의 모델과 몇 백개의 프로퍼티를 관리하려면... 무리가 있겠죠...