HANDA개발
HANDA개발공부
HANDA개발
전체 방문자
오늘
어제
  • HANDA_list
    • 취업일지
    • 일상
    • TIL
    • Linux
    • RabbitMQ
    • Spring
      • Security
      • Batch
      • Project
    • ERROR
    • DB
      • Oracle
      • PostgreSQL
    • JUnit
    • JAVA
    • AWS
    • OAuth2.0
    • Redis
    • API
    • Jenkins
    • Nigix
    • CS
    • 코테준비
      • 자료구조
      • 알고리즘
    • 학교수업
    • 디자인패턴

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 다른파라미터
  • EAI
  • 프로시져호출
  • 스프링배치
  • error
  • batch
  • 어노테이션
  • 상태관리
  • JVM
  • Spring
  • SpringBatch
  • @Valid
  • Job
  • 애플코딩
  • valid어노테이션
  • garbaage
  • Parameter
  • 데이터베이스
  • 프로그래머스
  • 재실행
  • 공부준비
  • JAVA명령어
  • gson
  • oracle
  • MQ
  • mybatis
  • 역직렬화
  • java실행과정
  • cmd
  • 명령어

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HANDA개발

HANDA개발공부

JAVA

Reflection

2022. 9. 7. 10:39

Reflection이란?

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

런타임에 지금 실행되고 있는 클래스를 가져와서 실행해야하는 경우

동적으로 객체를 생성하고 메서드를 호출하는 방법

자바의 리플렉션은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다.

어떤 경우에 사용되나?

코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우

프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이다.
-> intelliJ 자동완성 기능은 알거같은데 어노테이션은 어떻게 동작하는지 잘 모르겠다... 어노테이션을 학습해봐야 알 수 있을듯하다.

Java Reflection 사용 실습

Person이라는 클래스를 생성하고, 리플렉션을 사용해보자.

class Person {
    int age;

    Person() {
        this.age = 27;
    }

    Person(int age) {
        this.age = age;
    }

    int getAge() {
        return this.age;
    }
}

생성자 찾기
getDeclaredConstructor()를 이용해 클래스로부터 생성자를 가져올수 있다.

Class clazz = Class.forName("Person");
Constructor constructor = clazz.getDeclaredConstructor();

getDeclaredConstructor()는 인자가 없는 생성자를 가져온다.

Method 찾기

Class clazz = Person.class;
Method[] methodList = clazz.getDeclaredMethods();    
System.out.println(methods[0].invoke(clazz.newInstance())) // 27이 출력됨

invoke() 메소드를 사용하면 Method 객체를 실행할 수 있다. 첫번째 인자는 호출하려는 객체, 두번째 인자는 전달할 파라미터 값을 준다.

Field 변경

Class clazz = Person.class;
Field[] field = clazz.getDeclaredFields();
System.out.println(field[0]);   // 출력 : int reflection_test.Person.age

필드 가져오기

Class clazz = Person.class;
Field[] field = clazz.getDeclaredFields();

Person person = new Person();
field[0].set(person, 17);
System.out.println(field[0].get(person));  // 17이 출력됨 

set() 메소드를 사용해서 객체의 변수를 변경할 수 있다.

이외에도 리플렉션을 사용하는 여러가지 방법이 있지만, 블로그를 보고 간단하게 나만의 실습을 해보았다. 더 자세한 내용은 필요할때 블로그 참고해서 공부해보자. 이번엔 리플렉션이 무엇인지 이해하는게 목적.

 

참고자료 : https://codechacha.com/ko/reflection/

https://brunch.co.kr/@kd4/8

 

자바의 리플렉션

java reflection를 이해하시나요? | Java Reflection API를 이해하시나요? 리플렉션이란 개념은 초보 자바 개발자에게는 생소한 개념이고, 이해하기 힘든 개념인 것 같습니다. 일단 저에겐 그랬습니다. 그

brunch.co.kr

https://velog.io/@yeon/Reflection%EC%9D%B4%EB%9E%80

'JAVA' 카테고리의 다른 글

interface를 상속받은 Abstract class를 상속받는 이유.  (0) 2022.11.17
java10 _ var 키워드  (0) 2022.11.15
serialVersionUID와 @SuppressWarning("serial")처리  (0) 2022.11.14
Duration.ofSeconds  (0) 2022.08.19
Apache Ant  (0) 2022.08.19
    'JAVA' 카테고리의 다른 글
    • java10 _ var 키워드
    • serialVersionUID와 @SuppressWarning("serial")처리
    • Duration.ofSeconds
    • Apache Ant
    HANDA개발
    HANDA개발

    티스토리툴바