어노테이션과 리플렉션을 이용한 메소드 실행시간 출력
클래스에 PrintTime 어노테이션이 설정된 메소드를 찾아서 실행 시간을 출력한다.
어노테이션
@Target 은 어노테이션이 적용될 타입을 설정한다.
Method, Filed 등을 설정할 수 있다. 한번에 여러 개를 적용하는 것도 가능하다.
@Retention 은 어노테이션이 적용될 시점을 설정한다.
Source, Runtime 등을 적용할 수 있다. 적용 시점에 따라 어노테이션 정보가 안 보일 수도 있다.
리플렉션
Class.forName() 메소드를 이용하여 데이터를 생성한다.
메소드와 메소드의 어노테이션 정보를 확인하여 @PrintTime 어노테이션이 적용된 메소드를 실행하고
실행시간을 출력한다.
테스트로 스트림을 이용한 버전과 for 문을 이용한 버전을 작성
public class PrintMethodExecutionTime { /** * 리스트의 모든 값을 출력 */ @PrintTime public void exampleList() { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } list.forEach((x) -> System.out.print(x)); } /** * 배열의 모든 값을 출력 */ @PrintTime public void exampleArray() { int[] array = new int[10000]; for (int i = 0; i < 10000; i++) { array[i] = i; } for (int i = 0; i < 10000; i++) { System.out.print(array[i]); } } /** * 주어진 클래스에서 PrintTime 어노테이션이 붙은 메소드를 모두 실행 * * @param className * @throws Exception */ public static void printExecutionTime(String className) throws Exception { Class<?> c = Class.forName(className); // 스트림을 이용한 처리 Arrays.asList(c.getMethods()).forEach((method) -> { Arrays.asList(method.getAnnotations()).forEach((annotation) -> { if (annotation instanceof PrintTime) { System.out.println(method); long startTime = System.currentTimeMillis(); try { method.invoke(c.newInstance()); } catch (Exception e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("That took " + (endTime - startTime) + " milliseconds"); } }); }); // for 문을 이용한 처리 for (Method method : c.getMethods()) { for (Annotation annotation : method.getAnnotations()) { if (annotation instanceof PrintTime) { System.out.println(method); long startTime = System.currentTimeMillis(); method.invoke(c.newInstance()); long endTime = System.currentTimeMillis(); System.out.println("That took " + (endTime - startTime) + " milliseconds"); } } } } public static void main(String[] args) throws Exception { printExecutionTime(PrintMethodExecutionTime.class.getName()); } }
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PrintTime { }
반응형
'java' 카테고리의 다른 글
[Math] 좌표계의 x, y를 이용한 각도 구하기 (0) | 2016.05.19 |
---|---|
[개념] 스택(stack)과 힙(heap) (0) | 2016.02.16 |
[JDK8] Date, Calendar, LocaDateTime 날자 관련 객체들 사용법 (0) | 2015.06.09 |
[알고리즘] 퀵정렬 (0) | 2015.06.01 |
MSSQL 에서 Oracle 에 있는 테이블로 정보를 insert 프로그램 (0) | 2013.02.05 |