[Java] Reflection?

2024. 12. 16. 19:55· BE/Java
목차
  1. Reflection(리플렉션)
  2. Class
반응형

Reflection(리플렉션)

  • 클래스의 실체가 아닌 반사된 모습을 이용한 기능.
  • Class 를 이용
  • 리플렉션 기능을 지원하지 않는 언어 : C, C++. Pascal
  • 사용되는 기술 : JPA, Jackson, Mockito, Junit ...
  • 장점 
    • 외부, 사용자 정의 클래스들을 사용할 수 있게 함
    • 접근제어자에 관계없이 접근이 가능하도록 함
  • 단점
    • 컴파일 시점이 아닌, 런타임 시점에 클래스를 분석
      JVM을 최적화할 수 없어 성능저하
    • 마찬가지로, 컴파일 에러 확인 불가
    • 코드 가독성 저하
    • 내부가 노출되어 추상화 파괴 

 

Class

  • 실행중인 자바 어플리케이션의 클래스와 인터페이스의 정보를 가진 클래스
  • 클래스와 인터페이스의 정보를 가지고 있기 때문에, Class는 클래스의 내용을 모두 확인 가능
    (ex, 어노테이션, 생성자, 필드, 메서드, 부모 클래스 등)
  • public 생성자가 존재하지 않고, JVM에 의해 자동으로 생성
  • 메서드에 Declared 가 붙어있는 경우, 접근제어자 관계없이 해당 클래스에서 직접 관여한 부분을 조회
    • getMethods() : public 메서드에 한해서 부모 클래스와 부모 인터페이스에서 상속한 메서드를 포함하여 조회
      getDeclaredMethods() : 접근 제어자 관계없이 상속한 메서드를 제외하고 해당 클래스에서 직접 선언한 메서드를 조

 

Class 사용 방법

Person.java

package com.java8.other.reflection;

public class Person {
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private void privatePrint() {
        System.out.println("privatePrint : " + toString());
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

 

1) Class 가져오기

// 1. {클래스 이름}.class
Class<?> clazz1 = Person.class;

// 2. {인스턴스}.getClass()
Person person = new Person("김멍목", 28);
Class<?> clazz2 =  person.getClass();

// 3.Class.forName("클래스 주소")
Class<?> clazz3 = Class.forName("com.java8.other.reflection.Person");

 

 

2) 생성자를 가져와서 인스턴스 만들기

.getConstructor() 를 이용해서 생성자를 가져올 수 있으며, 파라미터에 따라 생성자를 구분 가능

Constructor<?> declaredConstructor1 = clazz2.getDeclaredConstructor();
Constructor<?> declaredConstructor2 = clazz2.getDeclaredConstructor(String.class, int.class);
Object instance = declaredConstructor2.newInstance("멍목2", 7);       // 방금 알아낸 생성자로 인스턴스 생성
System.out.println(instance.toString());

 

 

3) 접근제어자 무시하고 메서드 호출하기

Person person = new Person("김멍목", 28);
Class<?> clazz2 =  person.getClass();

Method method = clazz2.getDeclaredMethod("privatePrint");
method.setAccessible(true);     // 접근제어자 신경쓰지 않겠다.
System.out.println(method.getName());
method.invoke(person);          // 해당 메서드 실행

 

 

※ Entity, Request/Response DTO 에 기본 생성자가 필요한 이유

  • 리플렉션으로 기본 생성자를 가져와 인스턴스를 생성하고, 필드를 가져와서 값을 주입해주는 것이 간단하기 때문
  • 여러 생성자가 있을 경우, 간단하게 파라미터 타입이나 갯수를 신경쓰지 않고 기본 생성자로 객체 생성

 

※ Annotation은 주석인데 작동하는 이유

  • 리플렉션으로 getAnnotation(s)를 통해 해당 클래스에 어노테이션이 있는 지 확인

 

 

Reference

https://youtu.be/67YdHbPZJn4

https://ebabby.tistory.com/4

반응형

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

MapStruct 예제 및 리스트 매핑  (0) 2024.07.07
[BAEKJOON] 18405번 : 경쟁적 전염 (JAVA)  (1) 2024.06.09
[JMeter] JMeter 사용 및 설치 방법  (0) 2024.05.06
[Java 8] Stream, 데이터 리듀싱  (1) 2024.03.24
[Java 8] 람다식과 함수형 인터페이스  (0) 2024.03.10
  1. Reflection(리플렉션)
  2. Class
'BE/Java' 카테고리의 다른 글
  • MapStruct 예제 및 리스트 매핑
  • [BAEKJOON] 18405번 : 경쟁적 전염 (JAVA)
  • [JMeter] JMeter 사용 및 설치 방법
  • [Java 8] Stream, 데이터 리듀싱
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • Effective Java
  • 자기 개발
  • 자바 개발자를 위한 코틀린 입문
  • 전산회계 2급 준비
  • JPA 공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • 자바 공부
  • vue3 공부
  • 자바 테스팅 프레임워크
  • 코테 공부
  • 자기개발
  • 자기공부
  • 알고리즘 공부
  • 프로젝트로 배우는 Vue.js 3
  • 코테공부
  • 자바공부
  • MongoDB 기초부터 실무까지
  • junit5
  • MongoDB with Node.js
  • 자기 공부
  • MongoDB 공부
  • JPA
  • java 8
  • 코틀린
  • Java to Kotlin
  • 알고리즘공부
  • 더 자바 Java 8
  • 이펙티브자바
  • 이펙티브 자바
  • Oracle

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Java] Reflection?
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.