reflection 패키지
- reflection 패키지에 있는 클래스들을 사용하면 JVM에 로딩되어 있는 클래스와 메서드 정보를 읽어올 수 있다.
- 참고로 클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장되는데, 만약 엄청나게 많은 Class 클래스를 동적으로 생성하면 Perm 영역이 더이상 사용할 수 없게 되어 OutOfMemoryError가 발생할 수도 있다.
Class 클래스
- Class 클래스는 클래스에 대한 정보를 얻을 때 사용하며, 생성자는 따로 없다.
- Object 클래스에 있는 getClass() 메서드를 이용하면 Class 클래스를 생성할 수 있다.
주요 메서드
Stirng getName() | 클래스의 이름을 리턴한다. |
Package getPackage() | 클래스의 패키지 정보를 패키지 클래스 타입으로 리턴한다. |
Field[] getFields() | public으로 선언된 변수 목록을 Field 클래스 배열 타입으로 리턴한다. |
Field getField(String name) | name과 동일한 이름의 public 변수를 Field 클래스 타입으로 리턴한다. |
Field[] getDeclaredFields() | 해당 클래스에서 정의된 변수 목록을 Field 클래스 배열 타입으로 리턴한다. |
Field getDeclaredRield(String name) | name과 동일한 이름으로 정의된 변수를 Field 클래스 타입으로 리턴한다. |
Method[] getMethods() | public으로 선언된 모든 메서드 목록을 Method 클래스 배열 타입으로 리턴하며, 해당 클래스에서 사용 가능한 상속받은 메서드도 포함된다. |
Method getMethod(String name, Class... parameterTypes) |
지정된 이름과 매개변수 타입을 갖는 메서드를 Method 클래스 타입으로 리턴한다. |
Method[] getDeclaredMethods() | 해당 클래스에서 선언된 모든 메서드 정보를 리턴한다. |
Method getDeclaredMethod(String name, Class... parameterTypes) |
지정된 이름과 매개변수 타입을 갖는 해당 클래스에서 선언된 메서드를 Method 클래스 타입으로 리턴한다. |
Constructor[] getConstructors() | 해당 클래스에 선언된 모든 public 생성자의 정보를 Constructor 배열 타입으로 리턴한다. |
Constructor[] getDeclaredConstructors() | 해당 클래스에서 선언된 모든 생성자의 정보를 Constructor 배열 타입으로 리턴한다. |
int getModifiers() | 해당 클래스의 접근자 정보를 int 타입으로 리턴한다. |
String toString() | 해당 클래스 객체를 문자열로 리턴한다. |
Method 클래스
- Method 클래스를 이용하면 메서드에 대한 정보를 얻을 수 있다.
- Method 클래스는 생성자가 없기 때문에 Class 클래스의 getMethods() 메서드를 사용하거나 getDeclaredMethod() 메서드를 써서 생성할 수 있다.
메서드
Class<?> getDeclaringClass() | 해당 메서드가 선언된 클래스 정보를 리턴한다. |
Class<?> getReturnType() | 해당 메서드의 리턴 타입을 리턴한다. |
Class<?>[] getParameterTypes() | 해당 메서드를 사용하기 위한 매개변수의 타입들을 리턴한다. |
String getName() | 해당 메서드의 이름을 리턴한다. |
int getModifiers() | 해당 메서드의 접근자 정보를 리턴한다. |
Class<?>[] getExceptionTypes() | 해당 메서드에 정의되어 있는 예외 타입들을 리턴한다. |
Object invoke(Object obj, Object... args) | 해당 메서드를 수행한다. |
String toGenericString() | 타입 매개변수를 포함한 해당 메서드의 정보를 리턴한다. |
String toString() | 해당 메서드의 정보를 리턴한다. |
Field 클래스
- Field 클래스는 클래스에 있는 변수들의 정보를 제공하기 위해서 사용하며, Class 클래스의 getField()나 getDeclaredFields() 메서드를 사용해서 생성한다.
메서드
int getModiriers() | 해당 변수의 접근자 정보를 리턴한다. |
String getName() | 해당 변수의 정보를 리턴한다. |
String toString() | 해당 변수의 정보를 리턴한다. |
클래스 정보 분석
public void getClassInfo(Class demoClass) {
String className = demoClass.getName();
System.out.printf("Class Name: %s\n", className);
String classCanonicalName = demoClass.getCanonicalName();
System.out.printf("Class Canonical Name: %s\n", classCanonicalName);
String classSimpleName = demoClass.getSimpleName();
System.out.printf("Class Simple Name: %s\n", classSimpleName);
String packageName = demoClass.getPackageName();
System.out.printf("Package Name: %s\n", packageName);
String toString = demoClass.toString();
System.out.printf("toString: %s\n", toString);
}
필드 정보 분석
public void getFieldInfo(Class demoClass) {
Field[] field1 = demoClass.getDeclaredFields();
Field[] field2 = demoClass.getFields();
System.out.printf("Declared Fields: %d, Fields: %d\n", field1.length, field2.length);
for (Field field: field1) {
String fieldName = field.getName();
int modifier = field.getModifiers();
String modifierStr = Modifier.toString(modifier); // 식별자 정보 문자열로 리턴
String type = field.getType().getSimpleName();
System.out.printf("%s %s %s\n", modifierStr, type, fieldName);
}
}
메서드 정보 분석
public void getMethodInfo(Class demoClass) {
Method[] method1 = demoClass.getDeclaredMethods();
Method[] method2 = demoClass.getMethods();
System.out.printf("Declared Methods: %d, Methods: %d\n", method1.length, method2.length);
for (Method method: method1) {
String methodName = method.getName();
int modifier = method.getModifiers();
String modifierStr = Modifier.toString(modifier);
String returnType = method.getReturnType().getSimpleName();
Class params[] = method.getParameterTypes();
StringBuilder paramStr = new StringBuilder();
int paramLen = params.length;
if (paramLen != 0) {
paramStr.append(params[0].getSimpleName()).append(" arg");
for (int i = 0; i < paramLen; i++) {
paramStr.append(",").append(params[i].getName()).append(" arg").append(i);
}
}
Class[] exceptions = method.getExceptionTypes();
StringBuilder exceptionStr = new StringBuilder();
int exceptionLen = exceptions.length;
if (exceptionLen != 0) {
exceptionStr.append("throws").append(exceptions[0].getSimpleName());
for (int i = 0; i < exceptionLen; i++) {
exceptionStr.append(",").append(exceptions[i].getSimpleName());
}
}
System.out.printf("%s %s %s(%s) %s\n", modifierStr, returnType, methodName, paramStr, exceptionStr);
}
}
'Java > Java Tuning' 카테고리의 다른 글
Garbage Collector (GC) (0) | 2022.01.31 |
---|---|
JVM (Java Virtual Machine) (0) | 2022.01.31 |
서버 세팅 (0) | 2022.01.22 |