본문 바로가기
Dev/Java

Java reflection Sample Code

by 펭귄안에 온천 2022. 12. 16.
728x90
반응형
	/* 리플렉션(투영,반사) : 객체를 통해 클래스으 ㅣ정보를 분석해 내는 프로그램 기법
	 * 
	 * 객체의 메모리만 알고 있고, 객체의 형에 대해서 모를때
	 * 리플렉션으로 형은 알고 있지만 형변환은 할 수 없는 상태에서 객체의 메서드를 호출 할 수 있다.
	 */
	@Test
	public void reflectTest() throws Exception{

		// 클래스 정보 얻기 1
		Class clazz1 = Class.forName("proxy.Car");
		// 클래스 정보 얻기 2
		Class clazz2 = Car.class;


		//getDeclaredMethods 메소드 리스트 조회
		//getMethods 를 사용하면 상속된 메소드에 대한 정보를 얻을 수 있다.
		Method methods[] = clazz1.getDeclaredMethods(); 

		for(Method method : methods){
			System.out.println("==========");
			System.out.printf("name = %s \n" , method.getName());
			System.out.printf("decl class = %s \n" , method.getDeclaringClass());
			Class pvecs[] = method.getParameterTypes();
			for( Class pvec : pvecs){
				System.out.printf("param  = %s\n" , pvec );
			}

			Class evecs[] = method.getExceptionTypes();
			for( Class evec : evecs){
				System.out.printf("exec  = %s\n" , evec );
			}
			
			System.out.printf("return Type  = %s\n" , method.getReturnType() );
			System.out.println("==========\n");
		};

		

		//constructors 찾기
		Constructor constructors[] = clazz1.getDeclaredConstructors();
		for(Constructor constructor : constructors){
			System.out.println("*******************");
			System.out.printf("name  = %s\n" , constructor.getName() );
			System.out.printf("name  = %s\n" , constructor.getDeclaringClass() );
			System.out.println("*******************\n");

			Class pvecs[] = constructor.getParameterTypes();
			for(Class pvec : pvecs){
				System.out.printf("param  = %s\n" , pvec );
			}

			Class evecs[] = constructor.getExceptionTypes();
			for(Class evec : evecs){
				System.out.printf("exec  = %s\n" , evec );
			}
		}


		Field fields[] = clazz1.getDeclaredFields();
		for(Field field : fields){
			System.out.println("#################");
			System.out.printf("name  = %s\n" , field.getName() );
			System.out.printf("decl class  = %s\n" , field.getDeclaringClass() );
			System.out.printf("type  = %s\n" , field.getType() );
			int mod = field.getModifiers();
			System.out.printf("modifiers  = %s\n" , Modifier.toString(mod));
			System.out.println("#################\n");
		}

		// 메서드 실행
		Car car = new Car();
		Method stopMethod = clazz1.getMethod("stop");
		stopMethod.invoke(car);

		Class parType[] = new Class[2];
		parType[0] = String.class;
		parType[1] = Integer.TYPE;

		Method fixMethod = clazz1.getMethod("fix", parType);

		Object args[] = new Object[2];
		args[0] = "benz";
		args[1] = 3;
		fixMethod.invoke(car,args);
		Method hiMethod = clazz1.getMethod("HI");	
		hiMethod.invoke(car);

		//필드값 바꾸기
		Field field = clazz1.getField("doors");
		Car car2 = new Car();
		System.out.println(car2.doors);
		field.setInt(car2,99);
		System.out.println(car2.doors);
	}

	@Test
	public void invokeMethod() throws Exception{
		String name = "Spring";

		Method lengMethod = String.class.getMethod("length");
		assertThat( (Integer) lengMethod.invoke(name) , is(6));
		assertThat( name.charAt(0) , is('S') );

		Method charAMethod = String.class.getMethod("charAt",int.class);
		assertThat( (Character) charAMethod.invoke(name,0), is('S') );
		
	}
반응형

'Dev > Java' 카테고리의 다른 글

POJO 정리  (0) 2023.02.15
AOP 개인 저장용  (0) 2022.12.28
예외 처리 방법  (0) 2022.11.12
에러(error)와 예외(Exception)의 차이  (0) 2022.11.12
JNDI, JDBC, DBCP  (0) 2022.10.03