본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (4)

이 문서는 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