본문 바로가기

안녕하세요

오늘은 자바의 리플렉션이라는 계념에 대해서 알아보겠습니다.

 

 

java

 

리플렉션 (Reflection)이란?

 

리플렉션은 구체적인 클래스 타입을 알지 못해서 그 클래스의 메소드와 타입 그리고 변수들을 접근할 수 있도록 해주는 자바 API 입니다.

 

위 설명에 의하면 구체적인 클래스 타입을 모를때 사용하는 방법을 리플렉션이라고 합니다.

여기서 의문점이 듭니다.

 

내가 짠 코든데 내가 만든 클래스의 이름도 모르는게 말이 되나? 라는 의문이 생깁니다.

하지만 가끔 어떤 타입의 클래스나 변수 혹은 메소드를 사용할지 모르는 경우가 생깁니다.

 

예를 들어 변수의 값을 조건에 따라서 다르게 사용해야하는 경우라던가.

어플리케이션이 실행되고 나서 생성되는 클래스라던가.

 

이럴경우에 리플렉션을 사용할 수 있습니다.

 

사용방법

사용방법은 간단합니다.

Class 객체의 forName 메소드를 사용하여 클래스이름에 해당하는 클래스를 찾아옵니다.

ClassNotFound 에러가 날 수 있습니다.

Class c = Class.forName("클래스이름");

// 메소드
Method[] m = c.getMethods();                     

// 필드
Field[] f = c.getFields();

// 구조체
Constructor[] cs = c.getConstructors();
Class[] inter = c.getInterfaces();
Class superClass = c.getSuperclass();

 

 

이 방법 외에도 필드를 조작할 수 있습니다.

https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

Discovering Class Members (The Java™ Tutorials > The Reflection API > Classes)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See JDK Release Notes for information about new fe

docs.oracle.com

 

// 스프링 리플렉션 사용 코드
public static Field findField(Class<?> clazz, String name, Class<?> type) {
	// Assert.notNull(clazz, "Class must not be null");
	// Assert.isTrue(name != null || type != null, "Either name or type of the field must be specified");
	
    Class<?> searchType = clazz;
	while (!Object.class.equals(searchType) && searchType != null) {
		Field[] fields = searchType.getDeclaredFields();
		for (Field field : fields) {
			if ((name == null || name.equals(field.getName())) && (type == null || type.equals(field.getType()))) {
				return field;
			}
		}
		searchType = searchType.getSuperclass();
	}
	return null;
}

 

위 메소드를 사용하여 필드를 찾는 방법은 아래와 같습니다.

public static void main(String[] args) {
	Field field = findField(생성한 클래스, "생성한 변수명", String.class);
	System.out.println(field);
}

 

이 외에도 findMethod 라는 메소드를 제공하고 있습니다.

더 자세한 내용은 아래의 잘 정리된 블로그에서 확인 할 수 있습니다.

 

https://medium.com/msolo021015/%EC%9E%90%EB%B0%94-reflection%EC%9D%B4%EB%9E%80-ee71caf7eec5

자바 Reflection이란?

많은 입문용 자바 서적에서 잘 다루지 않는 Reflection이라는 개념에 대해서 알아보려고 합니다.

medium.com

안쓸것같지만 쓰게되는 자바 리플렉션입니다.

이상으로 자바 리플렉션 (java reflection) 알아보기 포스팅을 마치겠습니다.

엉망진창

개인 블로그 입니다. 코딩, 맛집, 정부정책, 서비스, ~방법 등 다양한 정보를 소개합니다