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

2015. 6. 4. 17:13·java

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

클래스에 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
'java' 카테고리의 다른 글
  • [개념] 스택(stack)과 힙(heap)
  • [JDK8] Date, Calendar, LocaDateTime 날자 관련 객체들 사용법
  • [알고리즘] 퀵정렬
  • MSSQL 에서 Oracle 에 있는 테이블로 정보를 insert 프로그램
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    HDFS
    하이브
    HIVE
    SPARK
    oozie
    오류
    정올
    백준
    S3
    mysql
    k8s
    알고리즘
    Tez
    bash
    java
    airflow
    hbase
    다이나믹
    파이썬
    Python
    Hadoop
    ubuntu
    emr
    Linux
    하둡
    yarn
    error
    AWS
    nodejs
    build
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[어노테이션] 어노테이션과 리플렉션을 이용한 메소드 실행시간 출력하기
상단으로

티스토리툴바