본문 바로가기
java

[어노테이션] 어노테이션과 리플렉션을 이용한 메소드 실행시간 출력하기

by hs_seo 2015. 6. 4.

어노테이션과 리플렉션을 이용한 메소드 실행시간 출력

클래스에 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 {

}

반응형