프로그래밍 정리/자바

Reflection(리플렉션)

주누다 2013. 7. 11. 02:41
반응형

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



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


Class class Example
==================================================================================================================

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class ClassclassTest {

public void printShow(){}
public static void main(String[] args) {
Class<?> c;
try {
c = Class.forName("ClassclassTest");
System.out.println("===Superclass 얻어내기===");
Class cla = c.getSuperclass();
System.out.println(cla.toString());
System.out.println("===Constructor[] 얻어내기===");
Constructor[] ctor = c.getConstructors();
for(Constructor ct : ctor){
System.out.println(ct.toString());
}
System.out.println("===Method[] 얻어내기===");
Method[] m = c.getMethods();
for(Method mt : m){
System.out.println(mt.toString());
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


result:
===Superclass 얻어내기===
class java.lang.Object
===Constructor[] 얻어내기===
public ClassclassTest()
===Method[] 얻어내기===
public static void ClassclassTest.main(java.lang.String[])
public void ClassclassTest.printShow()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

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





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형 : 틀림");

}

}

}


result :
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());

}

}


result:
11

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




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());

}

}



result:
world

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





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());

}

}


reuslt:
300


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

반응형

'프로그래밍 정리 > 자바' 카테고리의 다른 글

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