리플렉션, 어노테이션

이동주·2025년 3월 13일

JAVA

목록 보기
23/30

리플렉션

  • class 객체로 관리하는 클래스와 인터페이스의 메타 정보를 프로그램에서 읽고 수정하는 것

  • 메타 정보 : 구분할 수 있는 정보 (패키지 정보, 타입 정보, 생성자, 필드, 메소드 정보 등)

  • 메타 데이터 : 데이터를 정의하고 기술하는 데이터로 데이터에 대한 데이터이다.

  • 유연하게 코드를 작업할 수 있는 기능!

  • 리플렉션을 이용해 객체를 제작하는 것을 주입이라고 함

  • 리플렉션 활용하는 것이 좋음

  • Class 클래스의 메소드
    https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Class.html

패키지와 타입 정보 얻기

  • 패키지와 타입(클래스, 인터페이스) 이름 정보는 다음 메소드로 얻을 수 있음

package ch12.sec11.exam01;

public class Vehicle {
	//메소드 선언
	
	public Vehicle() {
		System.out.println("기본 생성자");
	}
	public void run() {
		System.out.println("차량이 달립니다.");
	}
}
package ch12.sec11.exam01;

public class Bus extends Vehicle {
	
	public Bus() {
		System.out.println("기본생성자 Bus() 호출");
	}
	
	//메소드 재정의(오버라이딩)
	@Override
	public void run() {
		System.out.println("버스가 달립니다.");
	}
}
package ch12.sec11.exam01;

public class Taxi extends Vehicle {
	
	public Taxi() {
		System.out.println("기본생성자 Taxi() 호출");
	}
	
	//메소드 재정의(오버라이딩)
	@Override
	public void run() {
		System.out.println("택시가 달립니다.");
	}
}
package ch12.sec11.exam01;

public class Truck extends Vehicle{
	public Truck() {
		System.out.println("기본 생성자 Truck() 호출");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("트럭이 달립니다");
	}
	
	public double add(double a, int b) {
		System.out.println("a= " + a);
		System.out.println("b= " + b);
		return a+b;
	}
	
	public double minus(double a, int b) {
		System.out.println("a= " + a);
		System.out.println("b= " + b);
		return a-b;
	}
}
package ch12.sec11.exam01;

public class Car {
}
package ch12.sec11.exam01;

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

public class GetClassExam {
	// throws Exception : 예외를 던짐
	public static void main(String[] args) throws Exception{
		
		// 매개값이 2개가 아니면
		// 매개값 측정하는 구문을 맨 앞에 둬야함
		if(args.length != 2) {
			System.out.println("실행에 필요한 정보 부족");
			System.exit(0);			
		}
		
		// 기본 생성자 입력
		// 매개변수를 쓰거나 클래스 이름을 String 형식으로 풀네임으로 적기
		Class clazz = Class.forName(args[0]);
		
		// 기본 생성자 정보를 얻는 것
		// java.lang 패키지에 속해있는 클래스로 사용시 import 해주기
		Constructor con = clazz.getConstructor();
		
		// 기본 생성자 호출
		Object obj = con.newInstance();
		
		// try : 예외가 생길 수 있는 구문들을 넣어줌
		try {
			// getMethod() : 해당 클래스의 메소드명을 입력하여 해당 메소드를 찾음
			// 메소드의 매개변수가 있을 경우 뒤에 인자를 입력하기
			// int.class : 매개변수 int를 가지는 해당 클래스(객체)
			// Method 클래스 : java.lang 소속이기 때문에 사용시 import 해주기
			Method run = clazz.getMethod(args[1], double.class, int.class);
			
			// 메소드가 있으면
			if(run != null) {
				// .invoke() : 해당 클래스의 메소드를 실행
				Object result = run.invoke(obj, 20.5, 10);
				System.out.println("result= " + result);
			}
			// 예외 발생 경우에 에러메세지 출력
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		
		
	}
}

리소스 경로 얻기

  • Class 객체는 클래스 파일(.class)의 경로 정보를 기준으로 상대 경로에 있는 이미지, XML, Property 파일 등의 다른 리소스 파일의 정보를 얻을 수 있음

어노테이션

  • 코드에서 @으로 작성되는 요소
  • 클래스 또는 인터페이스를 컴파일하거나 실행할 때 처리해야 할 방법을 알려주는 설정 정보
  • 컴파일 시 사용하는 정보 전달
  • 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달
  • 실행 시 특정 기능을 처리할 때 사용하는 정보 전달 (Spring boot 코드들)
  • @interface 뒤에 사용할 어노테이션 이름을 작성함

어노테이션 적용 대상

  • 어노테이션을 적용할 수 있는 대상의 종류는 ElementType 열거 상수로 정의
  • @Target 어노테이션으로 적용 대상을 지정함
  • @Target의 기본 속성 value 값은 ElementType 배열

어노테이션 유지 정책

  • 어노테이션 정의 시 @AnnotationName을 언제까지 유지할지 결정함
  • @Retention 어노테이션으로 적용 대상을 지정함
  • 어노테이션 유지 정책은 RetetionPolicy 열거 상수로 정의함

어노테이션 설정 정보 이용

  • 애플리케이션은 리플렉션을 이용해 적용 대상에서 어노테이션의 정보를 다음 메소드로 얻어냄
  • 사용만 하면 됨!

profile
끄작끄작

0개의 댓글