728x90
Reflection(리플렉션)이란?
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다.
런타임에 지금 실행되고 있는 클래스를 가져와서 실행해야하는 경우. 동적으로 객체를 생성하고 메서드를 호출하는 방법으로 Java의 리플렉션은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다.
Reflection을 사용하는 경우는 코드를 작성할 시점에 어떤 타입의 클래스를 사용할지는 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실랭해야하는 경우 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. 흔히 IDE의 종류중에 하나인 인텔리제이의 자동완성 기능. 그리고 스프링의 어노테이션이 리플렉션을 이용한 기능이라 볼 수 있다.
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() 메소드를 사용해서 객체의 변수를 변경
728x90
'JAVA' 카테고리의 다른 글
[Java] static 이란? (2) | 2022.03.24 |
---|---|
[Java] GC 종류별 차이 (0) | 2022.03.24 |
[Java] 제네릭 타입 컴파일 Generic type erasure (0) | 2022.02.24 |
[Java] 자바 제네릭이란? Java Generic (0) | 2022.02.24 |
[Java] 자바가 컴파일 되는 과정 (0) | 2022.02.23 |