SSAFY-Book-Study / modern-java-in-action

모던 자바 인 액션 북스터디입니다.
1 stars 10 forks source link

4 Weeks - [자바 리플렉션] #59

Open dpwns523 opened 1 year ago

dpwns523 commented 1 year ago

문제

contents - 세부 내용

14장을 읽다보니 리플렉션을 언급하면서 강력한 기능이지만 흘러가듯 설명하고 있어서 개념, 다양한 사용 사례, 활용 방안에 대해서 알아보고 정리하면 좋을 것 같습니다!

참고

Chapter14 - p456

skagmltn7 commented 1 year ago

리플렉션이란?

사용예시

리플렉션으로 가져올 수 있는 정보

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

Class 가져오기

// 1. 클래스의 이름을 알 경우
Class class = Child.class;
System.out.println("Class name: " + class.getName()); // Class name: test.Child

// 2. 클래스의 이름을 모를 경우
Class class2 = Class.forName("ssafy.Child");
System.out.println("Class name: " + class2.getName()); // Class name: ssafy.Child

Constructor 가져오기

// 1. 인자 없는 생성자
Class class= Class.forName("ssafy.Child");
Constructor constructor = class.getDeclaredConstructor();
System.out.println("Constructor: " + constructor.getName());// Constructor: ssafy.Child

// 2. 인자가 있는 생성자
// getDeclaredConstructor 파라미터에 타입에 일치하는 인자를 넣어주기
Constructor constructor2 = class.getDeclaredConstructor(String.class);
System.out.println("Constructor(String): " + constructor2.getName());// Constructor(String): ssafy.Child

// 3. 생성자 모두 가져오기
Constructor constructors[] = class.getDeclaredConstructors();
for (Constructor cons : constructors) {
    System.out.println("Get constructors in Child: " + cons);
}

// 4. public 생성자들만 가져오기
Constructor constructors2[] = class.getConstructors();
for (Constructor cons : constructors2) {
    System.out.println("Get public constructors in Child: " + cons);
}

Method 가져오기

Method method1 = class.getDeclaredMethod("method", int.class); 
// 출력
//public int ssafy.Child.method(int)

Method method2 = class.getDeclaredMethod("method", null);
// 출력
//public int ssafy.Child.method()

모듈에서의 리플렉션 접근 제어

자바 9 이전

다른 모듈들이 우리의 클래스에 대한 리플랙션을 사용할 수 있는지의 여부를 명시적으로 표현

Open

open module my.module { }

Opens

module my.module { opens com.my.package; }

Opens … To

module my.module { opens com.my.package to moduleOne, moduleTwo, etc.; }

자바에서의 리플렉션 사용사례

스프링에서의 리플렉션 사용사례

오라클 공식문서