리플렉션
리플렉션은 class, constructor, field, method 등을 다루기 위한 java 표준 api이다.
클래스나 메소드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다.
다음과 같은 클래스가 있다.
java.lang Class
java.lang.reflect Constructor
java.lang.reflect Field
java.lang.reflect Method
스프링 등의 프레임워크는 많은 내부처리에서 리플렉션을 사용하고 있다. 따라서 리플렉션을 이용하면 다음과 같은 장점이 있다.
프레임워크의 소스 코드를 이해할 수 있다..
소스 코드를 읽지 않고도 프레임워크 내부의 처리를 이미지화할 수 있다.
스스로 프레임워크를 만들 수 있다.
다만 보통의 실무의 업무로직 등에서는 리플렉션 기술을 사용하는 것을 권하지 않는다.
리플렉션으로 클래스와 메소드의 메타 정보를 사용해서 어플리케이션을 동적으로 유연하게 만들 수 있지만 리플렉션은 런타임에 동작하기 때문에 컴파일 시점에 오류를 잡을 수 없다.
따라서 리플렉션은 일반적으로 사용하는 것을 권장하지 않는다. 컴파일 시점에 오류를 잡도록 해야 더 안전하다.
즉 프레임워크 개발 또는 매우 일반적인 공통 처리가 필요할 때 부분적으로 사용해야 한다.
리플렉션 개본
- Class 클래스
Class 는 리플렉션을 나타내는 중심적인 존재이다.
Class 클래스의 정의는 Class<T> 같이 제네릭이 붙어 있다. T는 클래스를 지정한다.
Public class Member{
public static final Class<Member> class = (Member를 지칭하는 클래스 인스턴스);
}
여기에 더해 모든 클래스에는 getClass()라는 메소드가 정의되어 있다.
(java.lang.Object 클래스에 정의되어 있다.)
이 메소드의 반환 값은 .class 와 같이 그 클래스를 지칭하는 Class 인스턴스이다.
- 클래스명 취득
Class 클래스에는 클래스명을 취득하기 위한 메소드가 있다.
getName() 설명 : FQCN(Fully Qualified Class Name)이 반환된다.
getSimpleName(): 단순한 클래스명이 반환된다.
예제 코드
Import org.junit.api.Test;
Public class ReflectionTest{
public class Member{
}
@Test
void nameTest(){
Class<?> objectClass = Object.class;
String fqcn = objectClass.getName();
System.out.println(“getName() = “ + fqcn);
String simpleName = objectClass.getSimpleName();
System.out.println(“getSimpleName() ” + simpleName());
Class<Member> memberClass = Member.class;
String memberFqcn = memberClass.getName();
System.out.println(“getName() ” + memberFqcn);
String memberSimpleName = memberClass.getSimpleName();
System.out.println(“getSimpleName() = “ + memberSimpleName());
}
}
- 리플렉션으로 인스턴스 생성
예제코드
Public class Team {
public String name;
private int number;
public Team(String name, int number){
this.name = name;
this.number = numberr;
}
public int transferNumber(int value){
return number + value;
};
@Override
public String toString(){
return “Team{“ +
“name=“ + name + ‘\’ +
“, number=“ + number +
‘}’;
}
}
- 리플렉션으로 어노테이션의 값을 취득할 수 있다.
예제코드
테스트를 위해 어노테이션 작성: @MyAnnotation
Package hello.proxy.reflection
Import java.lang.annotation.ElementType;
Import java.lang.annotation Retention;
Import java.lang.annotation RetentionPolicy;
'Spring' 카테고리의 다른 글
어노테이션과 커스텀 어노테이션 만들기 (0) | 2024.07.08 |
---|---|
SuperBuilder 란 (0) | 2024.07.08 |
영속성 컨텍스트와 엔티티 매니저 (0) | 2024.07.08 |
학습테스트 마무리 (0) | 2024.07.07 |
ATDD 1주차 (0) | 2024.07.04 |