Reflection 클래스 정보


Java에서 제공하는 Relfection API를 통해 동적으로 클래스에 관련된 정보를 가져올 수 있다.

* Class 클래스 주요 메소드
String getName() : 패키지 포함 해당 클래스명 리턴
String getSimpleName() : 해당 클래스명 리턴
Field[] getFields() : public으로 선언된 변수 목록 리턴
Field[] getDeclaredFields() : 해당 클래스에 선언된 모든 변수 리턴
Method[] getMethods() : public으로 선언된 메소드 목록 리턴(해당 클래스에서 사용 가능한 상속 받은 메소드 포함)
Method[] getDeclaredMethods() : 해당 클래스에 선언된 모든 메소드 리턴
Constructor[] getDeclaredConstructors() : 해당 클래스에 선언된 모든 생성자 리턴
int getModifiers() : 해당 클래스의 접근자 정보 리턴
String toString() : 해당 클래스 객체를 문자열로 리턴

* Method 클래스 주요 메소드
String getName() : 해당 메소드명 리턴
int getModifiers() : 해당 메소드의 접근자 정보 리턴
String toString() : 해당 메소드 정보 리턴
Object invoke(Object obj, Object... args) : 해당 메소드 수행
Class<?> getDeclaringClass() : 해당 메소드가 선언된 클래스 정보 리턴
Class<?> getReturnType() : 해당 메소드 리턴 타입 리턴
Class<?>[] getExceptionTypes() : 해당 메소드 예외 타입들 리턴
Class<?>[] getParameterTypes() : 해당 메소드 매개변수 타입들 리턴

* Field 클래스 주요 메소드
String getName() : 해당 변수명 리턴
int getModifiers() : 해당 변수의 접근자 정보 리턴
String toString() : 해당 변수 정보 리턴

Modifier.toString(int modifier) : int 타입으로 리턴받은 modifier 값을 문자열로 리턴

* 참고사항
- 로그 선언시 클래스 이름을 알아내기 위해 this.getClass().getName() 사용한다고 성능이 크게 저하되지는 않는다. 
  하지만 클래스 객체를 얻는 방법 보다는 클래스명을 직접 명시하는 것을 권장한다.
- 클래스의 이름으로 해당 객체의 타입인지 비교하는 방법 보다 instanceof 키워드를 사용하는 것이 성능이 우수하다.
클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장된다. 
   Class 클래스를 사용하여 많은 양의 클래스를 동적으로 생성하면 Perm 영역을 더 이상 사용할 수 없게 되어 OutOfMemoryError가 발생한다.

참고서적 - 자바 성능 튜닝 이야기


'Development > Java' 카테고리의 다른 글

Garbage Collection 과정  (0) 2018.04.28
Garbage Collection 용어 정리  (0) 2018.04.26
AES256 암호화 오류 해결  (4) 2017.10.06
반복문 성능 비교  (0) 2017.07.27
List 중복 제거  (0) 2017.07.13

+ Recent posts