Reflection
- 클래스의 정보를 객체를 통해서 분석해내는 프로그램 기법
- 실행 중에 객체를 통해서 그 객체의 형을 확인
- 클래스의 정보를 객체를 통해서 런타임 시에 분석
- java.lang.reflect 패키지
- Reflection 일반적인 사용 방법
-> 메모리를 보유하고 있고, 형을 모르는 객체가 존재
-> 객체의 클래스 정보를 알아냄(Class class 생성)
-> 분석된 정보를 이용하여 멤버 메서드, 멤버 필드 사용
Top t1 = new Top();
Top t2 = t1; // t2의 형을 모른다고 가정
Class c = t2.getClass();
System.out.println("t2의 형은 :" + c.getName());
Class class
- Class class : 특정 객체의 타입(class)에 관한 정보를 갖고 있음
- ClassLoader가 '.class'를 메모리에 적재
- ClassLoader는 메모리에 적재된 '.class'파일을 Class class형태로 변환하여 가상머신에 저장
- Class class
-> getClass() 메서드 이용
=> Top1 = new Top();
Class c = t.getClass();
=> Class.forName() 메서드 이용
Class c = Class.forName("Top");
=> .class로 접근
Class c = Top.class;
Class class 로딩
- Class class 로딩 방법
-> '.class'로 접근
-> Class.forName("클래스 이름") 메서드 사용
-> getClass() 메서드 사용
=================================================================================================================
public class ClassclassLoadTest {
public static void main(String[] args) throws ClassNotFoundException {
String s = new String("Hello World Java");
Class c1 = s.getClass();
Class c2 = Class.forName("java.lang.String");
Class c3 = String.class;
System.out.println("c1 getClass : " + c1.getName());
System.out.println("c2 forName : " + c2.getName());
System.out.println("c3 String.class : " + c3.getName());
}
}
reuslt:
c1 getClass : java.lang.String
c2 forName : java.lang.String
c3 String.class : java.lang.String
Reflection의 실제 구현
- 생성자에 매개변수 없는 객체 생성
==================================================================================================================
import java.util.Vector;
public class NewObjectTest1 {
public static void main(String[] args) throws Exception{
Object obj = null;
Class c = Class.forName("java.util.Vector");
// 해당클래스의 새로운 객체를 만드는 메서드
obj = c.newInstance();
// 객체의 형을 비교
if(obj instanceof Vector){
System.out.println("Vector형 : 맞음");
}else{
System.out.println("Vector형 : 틀림");
}
}
}
==================================================================================================================
Reflection의 실제 구현
- 생성자에 매개변수 있는 객체 생성
==================================================================================================================
import java.lang.reflect.Constructor;
public class NewObjectTest2 {
public static void main(String[] args) throws Exception{
Class c = String.class;
Class[] paraType = new Class[]{String.class};
Constructor con = c.getConstructor(paraType);
Object[] initPara = new Object[]{"Hello World"};
Object obj = con.newInstance(initPara);
if(obj instanceof String){
System.out.println("String형 : 맞음, obj : " + obj);
}else{
System.out.println("String형 : 틀림");
}
}
}
result:
String형 : 맞음, obj : Hello World
==================================================================================================================
Reflection의 실제 구현
- 매개변수 없는 메서드 호출
==================================================================================================================
import java.lang.reflect.Method;
public class MethodInvoke1 {
public static void main(String[] args) throws Exception{
Class c = String.class;
Method m = c.getMethod("length", null);
String s = "Hello World";
Object result = m.invoke(s, null);
System.out.println(result.toString());
}
}
==================================================================================================================
Reflection의 실제 구현
- 매개변수 있는 메서드 호출
==================================================================================================================
import java.lang.reflect.Method;
public class MethodInvoke2 {
public static void main(String[] args) throws Exception{
Class c = String.class;
Class[] parameterTypes = new Class[]{int.class, int.class};
Method m = c.getMethod("substring", parameterTypes);
Object[] parametes = new Object[] {new Integer(6), new Integer(11)};
String s = "Hello world!";
Object result = m.invoke(s, parametes);
System.out.println(result.toString());
}
}
==================================================================================================================
Reflection의 실제 구현
- 멤버필드 값 알아내기
==================================================================================================================
import java.awt.Point;
import java.lang.reflect.Field;
public class GettingField {
public static void main(String[] args) throws Exception{
Class c = Class.forName("java.awt.Point");
Field f = c.getField("x");
Point p = new Point(300, 200);
Object x = f.get(p);
System.out.println(x.toString());
}
}
==================================================================================================================
'프로그래밍 정리 > 자바' 카테고리의 다른 글
URL (0) | 2013.07.11 |
---|---|
Web (웹) (0) | 2013.07.11 |
getClass() (0) | 2013.07.11 |
wait(), notify(), notifyAll() (0) | 2013.07.11 |
clone() (0) | 2013.07.11 |