Post

자바_리플랙션_01


리플랙션

  • 리플랙션은 언어이며, JVM 기능이고 실행동안 클래스와 객체 정보를 얻을 수 있음
  • 리플랙션 API는 JDK에 달린 클래스 집합과 메서드.



그래서 너가 뭘 할 수 있는데?


  • 리플랙션 API로 유연한 코드 작성
    • 소스코드를 수정하지않고 새로운 프로그램 순서 만들수있음
  • 다목적 알고리즘 작성가능 -> 실행하고 있는 클래스와 객체에 따라 알고리즘 조정가능



자바 리플랙션 사용된 곳


  • JUnit

    • 테스트 프로그램을 시작
    • 테스트 객체를 만들기
    • 주석에 따라 메서드를 전부 찾음
    • 순서대로 실행
    • 리포트를 작성
  • DI (의존성 주입)

    • 스프링 / 스프링 부트
  • 직렬화 / 역직렬화

    • JSON



리플랙션 Entry Point - Class<?>

  • Class<?> 는 어플리케이션 진입점
  • Class<?>은 객체의 런타임에 관한 정보가 있거나, 앱에 있는 특정한 클래스를 확인



클래스를 확인하는 세 가지 방법

  1. Object.getClass() ```java String stringObejct = “hello”; Car car = new Car(); Map<String, Integer> map = new HashMap<>();

==>

Class stringClass = stringObject.getClass(); Class carClass = car.getClass(); Class<?> mapClass = map.getClass(); // HaspMap은 인터페이스가 아니라, HaspMap은 클래스임 (변수의 런타임 타입)

primitive 타입은 객체가 아니라 타입정보를 못얻음

1
2
3
4
5
6
7
<br>

2. .class
```java
Class intTYpe = int.class


  1. Class.forName(…)
    1
    2
    
    Class<?> carType = Class.forName("패키지명.클래스명");
    Class<?> carType = Class.forName("패키지명.클래스명$내부 클래스명");
    
  2. 인스턴스를 확인하거나 만들려는 타입이 사용자 정의 구성 파일에서 전달될 떄 사용

  3. 우리가 확인하려는 클래스가 프로젝트에 없고 코드를 컴파일할 떄 클래스가 없으면 사용 —

? - 와일드 카드

  • 제네릭 - 와일드카드
    • Integer클래스는 Number 추상클래스를 상속받음
    • String은 CharSequence 인터페이스를 상속
    • 그러나 List 은 상위객체가 없음
    • 와일드카드는 제네릭의 타입 목록이면 전부 상위목록으로 해당된다
  • Class<?> - 와일드카드
    • 와일드카드가 있는 클래스로 매개변수 클래스 객체를 생성가능
    • 이 클래스가 상위 클래스임
    • 클래스의 제네릭 매개변수가 제네릭 타입이면 와이들카드를 사용해야함
      1
      2
      3
      4
      5
      
      public List<String> findAll(Class<? extends Collection> clazz) {
      // 컬렉션을 상속받은 클래스만 받을 수 있음.
      }
      // 클래스가 메서드로 전달되는걸 제한할 수 있음
      // 매개변수가 특정한 클래스와 인터페이스만 실행하도록 제한함
      

This post is licensed under CC BY 4.0 by the author.