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 의 완성도가 완벽해 지게 되었다.
제일 기본적인 리플렉션을 다루는 코드를 살펴 보았다.
'개발관련 > Java' 카테고리의 다른 글
Java Jad명령어 Decomfile 실행 옵션 (0) | 2025.03.03 |
---|---|
JavaDoc 주석 표기법 (0) | 2021.03.24 |
Console창에서 Javac로 하위폴더 java파일 모두 컴파일 하기 (0) | 2021.03.23 |
ArrayList와 HashMap의 차이점 (Java Collection) (0) | 2021.03.23 |
java 명령어 jar파일 실행지점 main클래스 지정 (0) | 2021.03.23 |