본문 바로가기

Study/Java

[Java] Reflection(리플렉션)

1. 개념


구체적인 클래스 타입을 알지 못할 때 해당 클래스의 메소드, 타입, 변수에 접근할 수 있게 해주는 자바 API

변수의 값을 조건에 따라 다르게 사용하거나 어플리케이션이 실행되고 나서 생성되어야 할 클래스가 있다면 사용할 수 있다.

 

 

2. 클래스 정보 가져오기


package com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        // 임의의 클래스 가져오기(클래스의 정보를 로드)
        Class<? extends String> strCls = "Person".getClass();
        System.out.println(strCls);    // class java.lang.String
        
    }
}

 

 

3. 이름으로 클래스 찾기


package com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
    
        // 이름으로 클래스 찾기
        try {
            Class<?> cls = Class.forName("com.cls.Person");
            System.out.println(cls);    // class com.cls.Person
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

 

4. 클래스 내부 메소드


package com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        // 클래스 내부의 메소드
        try {
            Class<?> cls = Class.forName("com.cls.Person");
            Method[] method = cls.getMethods();
            for (Method mtd : method) {
                System.out.println("name: " + mtd.getName());
                System.out.println("declare: " + mtd.getDeclaringClass());
                System.out.println("exceptions: " + Arrays.toString(mtd.getExceptionTypes()));
                System.out.println("params-type:" + Arrays.toString(mtd.getParameterTypes()));
                System.out.println("return-type: " + mtd.getReturnType());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

 

 

5. 클래스 내부의 필드


package com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        // 클래스 내부의 필드
        try {
            Class<?> cls = Class.forName("com.cls.Person");
            Field[] field = cls.getFields();
            System.out.println(Arrays.toString(field));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

 

6. 원시타입은 .class 사용


package com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        // 원시타입 : .class 문법을 사용
        boolean bl;
        // Class<?> blCls = bl.getClass();   // 컴파일 에러
        Class<?> blCls = boolean.class;
        System.out.println(blCls);


    }
}