5. 자주 하는 실수 (Tip)
@Retention(RUNTIME)누락. 기본값CLASS면getAnnotation이 항상null입니다. 예외도 없어서 "왜 안 읽히지" 로 한참 헤맵니다.같은 클래스 안 내부 호출.
this.transfer()는 프록시를 거치지 않습니다.@Transactional,@Cacheable,@Async모두 같은 이유로 무시됩니다.private 메서드에
@Transactional. CGLIB 는 하위 클래스를 만드는 방식이라 private 메서드를 덮어쓸 수 없습니다. 어노테이션이 조용히 무시되며, 아무 경고도 없습니다.InvocationTargetException을 그대로 던짐. 원본 예외가 감싸져 상위catch (IllegalStateException)이 잡지 못합니다. 프록시 핸들러에서는getCause()를 다시 던집니다.Long.class로long메서드 찾기. 리플렉션은 오토박싱을 모릅니다. 시그니처의 원시 타입은long.class,int.class로 정확히 지정합니다.@Param없이 인자 두 개.#{id}가arg0을 찾지 못해 바인딩 오류가 납니다. 인자가 둘 이상이면@Param을 붙이거나-parameters로 컴파일합니다.리플렉션을 루프 안에서 매번 조회.
getMethod는 느립니다. 한 번 찾은Method·Field는 필드나 캐시에 보관하고 재사용합니다.getDeclaredMethods()순서에 의존. JVM 마다, 실행마다 순서가 다를 수 있습니다. 순서가 필요하면 정렬하거나 어노테이션에order속성을 둡니다.