반응형

Java Reflection란?

 

리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다.

투영, 반사 라는 사전적인 의미를 지니고 있다

 

Class c = Data.class;

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

 

Method[] m = c.getMethods();                     

Field[] f = c.getFields();

Constructor[] cs = c.getConstructors();

Class[] inter = c.getInterfaces();

Class superClass = c.getSuperclass();

 

 

===========================================================================================================================

===========================================================================================================================

<설명1>

 

 

스프링을 공부하다가 보면 BeanFactory 라는 Spring Container 개념을 학습하게 된다.

이 BeanFactory는 어플리케이션이 실행한 후 객체가 호출 될 당시 객체의 인스턴스를 생성하게 되는데 

그 때 필요한 기술이 Reflection이다.

자바는 스크립트 언어가 아닌 컴파일 언어이다. 물론 .java -> .class -> 실행이라는 2단계의 메커니즘을 가지고 있지만 컴파일 언어로 분리하는 게 옳다. 원래 자바에서는 동적으로 객체를 생성하는 기술이 없었다. 그리고 동적으로 인스턴스를 생성하는 Reflection으로 그 역활을 대신하게 된다.

 

리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다. 투영, 반사 라는 사전적인 의미를 지니고 있다

 

가정을 해 보자. 만약 객체의 메모리만을 알고 있고, 그리고 객체의 형에 대해서는 모른다고 생각하보자, 

리플렉션으로 형은 알고 있지만 형변환을 할 수 없는 상태에서 객체의 메서드를 호출할 수 있다.

 

Class 클래스

.class의 등록정보 클래스, 바이트 코드의 등록정보 클래스로 표현할 수 있다,

 

Class c = Data.class;

Method[] m = c.getMethods();

 

Field[] f = c.getFields();

 

Constructor[] cs = c.getConstructors();

 

Class[] inter = c.getInterfaces();

 

Class superClass = c.getSuperclass();

 

클래스의 정보를 가져올 수 있다.

java.lang.reflect.*

 

[정적 바인딩]

 

Class c = Data.class;

Object obj = c.newInstance();

Data d1 = (Data)obj;

 

Class c2 = d1.getClass();

Data d2 = (Data)c2.newInstance();

 

[동적바인딩]

컴파일 시에 새로 바인딩 시킬 클래스가 없을 때

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

Object obj = c.newInstance();

 

동적으로 바인딩된 클래스로 객체를 생성했을 때는 다운캐스팅이 불가능하다.

즉 클래스이름 d = (클래스이름)obj // 컴파일시에 클래스이름의 클래스가 없다

 

그러면 어떻게 메소드를 호출할 수 있을까??

 

reflect 패키지않에는 실시간에 객체의 능력을 분석한 후 다운캐스팅을 할 수 없는 객체라 할지라도 모든 작업을 할 수 있게 지원해 주는 클래스들이 들어 있다.

 

[동적 바인딩 2]

 

Class Student

 

Class Manager

public void action(Object obj)

if( obj instanceof Student )

학생이군요

Student std = (Student)obj; 

else

학생이 아니군요

 

Class Main{

Manager m = new Manager();

m.action(new Object());

m.action(new Student());

}

 

참 신기하게도 신기하게도 어떻게 보면 자바 초반에 한번 쯤 만나게 되는 키워드인

instanceof 키워드를 여기서 다시 만나게 되었다.

형 확인 키워드!! 이것으로 reflection 의 완성도가 완벽해 지게 되었다.

 

제일 기본적인 리플렉션을 다루는 코드를 살펴 보았다.

 

+ Recent posts