[java] 리플렉션을 이용한 자바 빈 사용하기
리플렉션(reflection)은 런타임 시에 클래스의 정보를 분석하고, 필드나 메서드를 동적으로 다룰 수 있게 해주는 기술입니다. 자바 빈(JavaBean)은 특정 목적을 가지고 있는 재사용 가능한 소프트웨어 구성 요소로, 특정 규약에 따라 작성된 클래스입니다. 이 두 기술을 결합하여 자바 빈을 동적으로 활용할 수 있습니다.
자바 빈 개념
자바 빈은 아래와 같은 특성을 가지고 있습니다.
- 멤버 변수(필드)는 private으로 선언되고, getter와 setter 메서드를 제공합니다.
- 기본 생성자를 반드시 포함해야 합니다.
- 직렬화가 가능해야 합니다.
자바 빈을 리플렉션을 이용해 동적으로 다루는 방법은 다음과 같습니다.
리플렉션을 이용한 자바 빈 사용하기
아래는 리플렉션을 사용하여 자바 빈의 필드 값을 얻고 설정하는 간단한 예제 코드입니다.
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class BeanReflectionExample {
public static void main(String[] args) throws Exception {
// 대상이 되는 자바 빈 객체 생성
UserBean user = new UserBean("John Doe", 30);
// getClass를 이용해 런타임에 객체의 클래스 정보 가져오기
Class<?> userClass = user.getClass();
// 클래스 이름 출력
System.out.println("Class name: " + userClass.getName());
// 클래스에 선언된 필드들에 접근
Field[] fields = userClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("Field name: " + field.getName());
// getter 메서드 호출
Method getter = userClass.getMethod("get" + capitalize(field.getName()));
System.out.println("Field value: " + getter.invoke(user));
}
}
// 첫 문자를 대문자로 변환하는 유틸리티 메서드
public static String capitalize(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
}
class UserBean {
private String name;
private int age;
public UserBean(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;
}
}
위 예제에서는 UserBean
클래스의 필드에 리플렉션을 이용해 접근하고, getter 메서드를 호출하여 필드 값에 접근합니다. 이를 통해 런타임에 동적으로 객체를 다룰 수 있는 것을 확인할 수 있습니다.
리플렉션을 이용하면 자바 빈의 필드나 메서드를 정적으로 정의하지 않고도 동적으로 다룰 수 있어, 다양한 상황에서 유연한 프로그래밍을 할 수 있다는 장점이 있습니다.
결론
리플렉션을 이용하여 자바 빈을 동적으로 다룰 수 있어, 프로그램의 유연성을 높일 수 있습니다. 다만, 리플렉션은 성능 저하와 보안 문제에 대한 고려가 필요하므로 신중하게 사용해야 합니다.
이상으로 자바 빈과 리플렉션을 이용한 동적 객체 생성에 대해 알아보았습니다.
Java 리플렉션 문서를 참고하면 더 많은 정보를 얻을 수 있습니다.