이 문서는 Oracle Technology Network에 포스팅되었던 Using Java Reflection을 참고하여 작성되었습니다. 원문은 아래의 링크에서 확인하실 수 있습니다.
Using Java Reflection
https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class Field 정보 가져오기
Reflection을 이용하면 class에 정의된 data field 정보도 확인할 수 있습니다.
import java.lang.reflect.*;
public class field1 {
private double d;
public static final int i = 37;
String s = "testing";
public static void main(String args[]) {
try {
Class cls = Class.forName("field1");
Field fieldlist[] = cls.getDeclaredFields();
for (int i = 0; i < fieldlist.length; i++) {
Field fld = fieldlist[i];
System.out.println("name = " + fld.getName());
System.out.println("decl class = " + fld.getDeclaringClass());
System.out.println("type = " + fld.getType());
int mod = fld.getModifiers();
System.out.println("modifiers = " + Modifier.toString(mod));
System.out.println("-----");
}
} catch (Throwable e) {
System.err.println(e);
}
}
}
앞에서 다른 함수나 생성자들과 다르게 Modifier라는 키워드가 새로 등장했습니다. Modifier는 field 멤버의 modifier를 나타내주는 reflection class입니다. 예를 들자면 "private int" 등이 이에 해당할 것입니다.
modifier는 그 자체로는 정수형의 값을 갖고 있지만, Modifier.toString 함수를 통해 문자열로 정의된 실제적인 값을 가져올 수 있습니다. 이는 Modifier 내에 공식적으로 정의된 규칙에 따라 출력되게 됩니다.
출력결과는 아래와 같습니다.
name = d decl class = class field1 type = double modifiers = private ----- name = i decl class = class field1 type = int modifiers = public static final ----- name = s decl class = class field1 type = class java.lang.String modifiers = -----
함수와 마찬가지로 getDeclaredFields를 이용하여 class 내에 선언된 field에 대한 정보를 가져올 수 있으며, getFields를 이용하면 superclass에 정의된 field 정보를 가져올 수 있습니다.
Modifier에 정의된 toString 함수는 아래와 같으니 참고하시기 바랍니다.
public static String toString(int mod) {
StringBuilder sb = new StringBuilder();
int len;
if ((mod & PUBLIC) != 0) sb.append("public ");
if ((mod & PROTECTED) != 0) sb.append("protected ");
if ((mod & PRIVATE) != 0) sb.append("private ");
/* Canonical order */
if ((mod & ABSTRACT) != 0) sb.append("abstract ");
if ((mod & STATIC) != 0) sb.append("static ");
if ((mod & FINAL) != 0) sb.append("final ");
if ((mod & TRANSIENT) != 0) sb.append("transient ");
if ((mod & VOLATILE) != 0) sb.append("volatile ");
if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized ");
if ((mod & NATIVE) != 0) sb.append("native ");
if ((mod & STRICT) != 0) sb.append("strictfp ");
if ((mod & INTERFACE) != 0) sb.append("interface ");
if ((len = sb.length()) > 0) /* trim trailing space */
return sb.toString().substring(0, len-1);
return "";
}
'Java > Java 기초' 카테고리의 다른 글
Java Reflection 사용하기 (6) (0) | 2019.02.15 |
---|---|
Java Reflection 사용하기 (5) (0) | 2019.02.15 |
Java Reflection 사용하기 (3) (0) | 2019.02.13 |
Java Reflection 사용하기 (2) (0) | 2019.02.12 |
Java Reflection 사용하기 (1) (0) | 2019.02.12 |