Open skarltjr opened 2 years ago
진짜로 뽑아오는지 확인해보기
@Test
@DisplayName("ReflectionTestUtils가 어떻게 리플랙션을 활용하여 특정 클래스의 정보를 뽑아오는가 확인")
void testReflection() throws ClassNotFoundException {
Class<?> targetClass = Class.forName("com.msa.domain.Product");
Field[] declaredFields = targetClass.getDeclaredFields();
Field[] fields = targetClass.getFields();
Method[] methods = targetClass.getMethods();
System.out.println("fields입니다");
for (Field field : fields) {
System.out.println(field.getName());
}
System.out.println(" ----- ");
System.out.println("methods입니다");
for (Method method : methods) {
System.out.println(method.getName());
}
}
여기서 fields와 declaredFields를 볼 수 있는데
처음에 targetClass.getFields()로 뽑아와서 확인했더니 아무것도 나오지않았고 분명 접근제어자와 관계가 있지않을까생각했다
그래서 다른 매서드인 targetClass.getDeclaredFields()를 활용해서 뽑아왔더니 private 필드도 다 가져올 수 있었다.
@Entity
@Getter
@Table(name = "products")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_id")
private Long id;
@Embedded
@Column(nullable = false)
private ProductInfo productInfo;
@Column(name = "created_at")
@CreatedDate
private LocalDateTime createdAt;
@Column(name = "updated_at")
@LastModifiedDate
private LocalDateTime updatedAt;
@Version
@Column(name = "product_version")
private int version=0;
<img width="1149" alt="스크린샷 2022-04-11 오후 10 20 51" src="https://user-images.githubusercontent.com/62214428/162748439-a87087c6-c1eb-488e-b748-e11b8d3cb8e3.png">
4.
setAccessible을 통해 privateField에 접근하여 값을 변경할 수 있다고한다. 다만 아직까지 모르겠는게 결국 ReflectionTestUtils처럼 동작하기위해선 생성된 객체. 즉 특정 인스턴스를 찾아와서 값을 바꿔줘야한다고 생각하는데 어떻게 찾는지 나중에 더 알아봐야겠다
개요 :
방법:
동작방식 :