language/java

Class 객체 - Reflection API

wooweee 2023. 3. 28. 14:45
728x90

Class 객체

  • java.lang.Class
  • 클래스는 모든 클래스의 메타 정보를 나타내는 클래스
  • 클래스의 모든 정보 제공 : 생성자, 필드, 메서드, 접근 제어자,어노테이션 등등
  • 클래스 당 1개만 존재
  • Class 객체 자체 메서드 존재


  • 원리
    1. Car class를 작성한 Car.java 파일이 존재
    2. 프로그램에서 참조변수로 해당 Car type을 부름
    3. Car.java -> compile  -> Car.class : 컴파일 완료
      • 컴파일 된 .class 파일은 한 파일(xxx.java) 내에 여러 class 클래스명{}들이 존재하더라도 compile시 각각의 파일(.class)로 나누어준다.
        그래서 Class 객체가 클래스당 1개만 존재가 가능
    4. ClassLoader라는 것을 통해서 (위의 과정과 같이 클래스 정보가 필요할 때 Class 객체를 생성) Class 객체 생성
      • Class 객체 생성시 고유 class 이름과 package를 부여 - 다른 class와 구분이 가능
        Class 객체를 통한 해당 type의 instance를 생성할 때 package키워드.class키워드 형식으로 뽑아내야함
        1. 클래스 이름: 클래스 정의에서 class 키워드 다음에 나오는 이름
        2. 패키지 이름: 클래스 정의에서 package 키워드 다음에 나오는 이름


  • 장점
    • class 파일도 결국에는 객체 -> 정보와 메서드가 존재
    • Car.java -> Car.class -> Method Area에 Car class 객체로 존재(Class 객체) 
    • Class 객체로 할 수 있는 것들 
      1. 정보를 얻을 수 있다 - iv가 몇개인지, 메서드가 몇개인지 , 애노테이선, 등등 정보를 얻을 수 있다.
      2. 객체 생성
      3. 메서드 호출
    • Class 객체로 할 수 있는 것을 활용해서 Reflection API 기능을 적용할 수 있다.



  • Class 객체 얻는 방법
    1. Class carClass = new Car().getClass();
      1. Car car = new Car();
      2. Car car = carClass.newInstance(); -> 코드 변경이 필요시 동적으로 다른 클래스 객체를 만들 수 있도록 한다.
    2. Class carClass = Car.class;
    3. Class carClass = Class.forName(p.getProperty());

 

 

Reflection API

 

  • 특징
    • java.lang.reflect 패키지
    • Class의 정보를 동적으로 가져오고, Class의 인스턴스를 생성하고,Class의 필드와 메소드에 접근하는 방법을 제공
    • Reflection API는 java.lang.Class 클래스를 중심으로 동작
    • Reflection API는 이 클래스를 사용하여 클래스의 정보를 가져온다.
      == Reflection API를 사용하려면 먼저 해당 클래스의 java.lang.Class 객체를 가져와야한다.

 

 

 
  • 핵심
    • Reflection API는 java.lang.Class 객체를 사용하여 클래스의 정보를 나타내고 조작
    • -> 컴파일 타임에는 알 수 없는 클래스의 정보를 런타임에 알아낼 수 있으며, 이를 활용하여 유연하고 동적인 프로그래밍 가능
      • Car class Instance가 Object 타입의 참조변수와 연결되면 실제 Car class의 필드와 메서드를 사용 불가
      • Reflection api의 기능을 이용(=Class 객체 이용) 해서 동적으로 Object 참조변수를 Car type으로 참조변수로 변경하지 않고도 Car 객체 내부의 값을 변경이 가능
      • 참고 블로그 : https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/

 

 

  • 결론
    • 어떤 type의 class가 오던지 간에 처리가 가능해지는 힘이 생긴다는 것을 의미
    • 주로 프레임워크나 라이브러리에서 사용
      1. Spring의 DTO 때 reflectionAPI 적용
      2. Spring DI도 reflectionAPI 적용