본문 바로가기
Java

[Java] 자바의 리플렉션

by 코리늬 2020. 6. 12.

자바에 대한 공부를 하던중 리플렉션이라는 개념이 있었다.

막상 예제를 보니 이미 사내 소스코드에 그렇게 쓰는 부분이 있음을 바로 알 수 있었다.

Java Reflection API

  • 구체적인 클래스 타입을 알지 못해도, 해당 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API
  • 구체적인 클래스 타입을 알지 못하면 메소드를 실행 할 수 없다.

리플렉션이 가능한 이유는?

  • 자바의 클래스 파일은 바이트 코드로 컴파일되어 Method 영역에 적재되어있다. 그래서 이 영역에서 클래스에 대한 정보를 가져올 수 있다.

    ClassName
    Class Modifiers (public, private, synchronized 등)
    Package Info
    Implemented Interfaces
    Consturctors
    MethodsFields
    Annotations

사용방법

public static void main(String args[]) {

        try {

            Class c = Class.forName(args[0]);

            Method m[] = c.getDeclaredMethods();

            for (int i = 0; i < m.length; i++)

                System.out.println(m[i].toString());

        } catch (Throwable e) {

            System.err.println(e);

        }

}

##############################################
명령

java DumpMethods java.util.Stack



실행 결과

  public java.lang.Object java.util.Stack.push(
    java.lang.Object)
   public synchronized 
     java.lang.Object java.util.Stack.pop()
   public synchronized
      java.lang.Object java.util.Stack.peek()
   public boolean java.util.Stack.empty()
   public synchronized 
     int java.util.Stack.search(java.lang.Object)

주의할 점

  • priavte 멤버고 접근 조작이 가능하므로 주의해야 한다.

    Field.setAccessible() 메소드를 true로 지정하면 접근이 가능하다.

참고

https://madplay.github.io/post/java-reflection

https://brunch.co.kr/@kd4/8

'Java' 카테고리의 다른 글

[Java] Primitive Type VS Reference Type  (0) 2020.07.01
[Java] 자바 8은 왜 쓸까?  (0) 2020.06.17
[Java] 자바 직렬화, serialVersionUID  (0) 2020.06.07
[Java] Atomic Type vs Synchronized  (0) 2020.01.31
Enum 클래스 작성방법  (0) 2019.12.08

댓글