자바에 대한 공부를 하던중 리플렉션
이라는 개념이 있었다.
막상 예제를 보니 이미 사내 소스코드에 그렇게 쓰는 부분이 있음을 바로 알 수 있었다.
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로 지정하면 접근이 가능하다.
참고
'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 |
댓글