HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

자바 리플렉션 테스트(Java Reflection Test)

자바 기본기 공부가 필요하다 생각 되서 리플렉션을 연습하기 위해 짤막한 예제를 하나 만들어서 돌렸다. 이걸 어떻게 응용을 할까 고민이 된다.

/* 리플렉션 테스트 (ReflectTest.java) */
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectTest {
	public static void main(String[] args) throws ClassNotFoundException 
	{
		// 클래스 정보를 가져온다.
		Class<?> cls = Class.forName("ReflectCls");
		
		// 가지고 있는 멤버 변수를 출력해보자. public 멤버 변수만 가져온다.
		Field[] fields = cls.getFields();
		for( Field field : fields ){
			System.out.println(field.getType().getName()+" "+field.getName());
		}
		System.out.println("--------------------------------------------");
		
		// 가지고 있는 메소드의 이름을 출력 해보자. public 메소드만 가져온다.
		Method[] methods = cls.getMethods();
		StringBuffer sb = new StringBuffer();
		for( Method method : methods ){
			sb.append(method.getName());
			
			// 메소드 인자가 있다면 출력하자.
			Class<?>[] argTypes = method.getParameterTypes();
			sb.append("(");
			int size = argTypes.length;
			for( Class<?> argType : argTypes ){
				String argName = argType.getName();
				sb.append(argName + " val");
				if( --size != 0 ){
					sb.append(", ");
				}
			}
			sb.append(")");
			
			// 리턴 인자를 출력하자.
			Class<?> returnType = method.getReturnType();
			sb.append(" : " + returnType.getName());
			
			System.out.println(sb);
			sb.setLength(0);
		}
		System.out.println("--------------------------------------------");
		
		// 가지고 있는 메소드를 써보자
		try {
			// 객체 하나 생성
			Object obj = cls.newInstance();
			
			// sum 메소드를 가져와서 합 구하기 (인자 파라미터 나열)
			Method method = cls.getMethod("sum", int.class, int.class);
			System.out.println(method.invoke(obj, 1, 2));
			
			// sum 메소드를 가져와서 합 구하기 (클래스 배열 파라미터)
			Class[] param = {int.class, int.class};
			method = cls.getMethod("sum", param);
			System.out.println(method.invoke(obj, 5, 2)); 
			
			// sum 메소드를 가져와서 합 구하기 (다이렉트)
			method = cls.getMethod("sum", new Class[]{int.class, int.class});
			System.out.println(method.invoke(obj, new Object[]{1, 5})); 
			
			// sub static 메소드를 가져와서 차이 구하기
			method = cls.getMethod("sub", int.class, int.class);
			// static 메소드는 클래스 객체가 필요 없다.
			System.out.println(method.invoke(null, 3,1 )); 
			// 있어도 상관은 없다.
			System.out.println(method.invoke(obj,  3,1 ));
			System.out.println(method.invoke(cls,  3,1 ));
			
			// 오버로딩 - 매개 인자가 없는 메소드 실행하기
			method = cls.getMethod("getArrayList", (Class<?>[]) null);
			method.invoke(obj);
			method = cls.getMethod("getArrayList");
			method.invoke(obj);
			
			// 오버로딩 - 매개 인자가 있는 메소드 실행하기
			method = cls.getMethod("getArrayList", new Class[]{int.class});
			method.invoke(obj, new Object[]{1});
			
			// 클래스를 형변환해서 테스트
			ReflectCls c = (ReflectCls)obj;
			System.out.println(c.sum(5, 2));
			System.out.println(c.sub(5, 2));
			System.out.println(ReflectCls.sub(5, 2));
			

		} catch (
				InstantiationException   | IllegalAccessException | 
				NoSuchMethodException    | SecurityException | 
				IllegalArgumentException | InvocationTargetException e
				) 
		{
			e.printStackTrace();
		}
	}
	
}
/* 리플렉션 테스트 (ReflectCls.java) */
import java.util.ArrayList;

public class ReflectCls {
	
	private String privateStr;
	protected String protectedStr;
	public String publicStr;
	
	public ArrayList<String> getArrayList(){
		System.out.println("인자 없는 getArrayList");
		return new ArrayList<String>();
	}
	public ArrayList<String> getArrayList(int a){
		System.out.println("인자 있는 getArrayList");
		return new ArrayList<String>();
	}	
	public String[] getStringArray(){
		return new String[5];
	}
	public int sum( int a, int b ){
		return a+b;
	}
	public static int sub( int a, int b ){
		return a-b;
	}
	private void setStringArray(String[] a){
	}
}
java.lang.String publicStr
--------------------------------------------
sum(int val, int val) : int
getArrayList() : java.util.ArrayList
getArrayList(int val) : java.util.ArrayList
getStringArray() : [Ljava.lang.String;
sub(int val, int val) : int
getClass() : java.lang.Class
hashCode() : int
equals(java.lang.Object val) : boolean
toString() : java.lang.String
notify() : void
notifyAll() : void
wait(long val) : void
wait(long val, int val) : void
wait() : void
--------------------------------------------
3
7
6
2
2
2
인자 없는 getArrayList
인자 없는 getArrayList
인자 있는 getArrayList
7
3
3