Java 프로그램 개발 시 Reflection을 이용하여 Field의 값을 Map 등 다른 Object에 생성하고자 하는 경우 Java에서 제공하는 Reflection API, Apache commons-lang3 FieldUtils 사용, Spring Framework에서 제공하는 ReflectionUtils을 사용할 수 있다.
먼저 Apache commons-lang3에서 제공하는 FiledUtils 예제는 다음과 같다.
■ TestVo.java
public class TestVo {
private String name;
private int age;
private String password; 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; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
}
|
■ FieldUtils 예제
import org.apache.commons.lang3.reflect.FieldUtils; public static void main(String[] args) { TestVo vo = new TestVo(); vo.setAge(10); vo.setName("kkimdoy"); vo.setPassword("aaaaa"); /** age를 20으로 변경 **/ FieldUtils.writeField(vo, "age", 20, true);
Field[] fields = FieldUtils.getAllFields(vo.getClass());
for (Field field : fields) { String name =field.getName(); Object object = FieldUtils.readField(vo, name, true); LOGGER.debug("{} :: {}", name, object); } } |
먼저 TestVo에 값을 Set한 후 FieldUtils.getAlFiled() 메소드를 이용하여 객체의 모든 Filed를 조회한다.
getAllField의 Parameter는 Class이므로 vo 객체를 class로 변환하여 파라미터로 사용한다.
FiledUtils.readField 메소를 이용하여 Field의 값을 추출할 수 있다. 파라미터 중 마지막 파라미터는 private 필드를 Access할 때 true 값을 파라미터로 전달한다.
■ ReflectionUtils 예제
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils.FieldCallback; public static void main(String[] args) { final TestVo vo = new TestVo(); vo.setAge(10); vo.setName("kkimdoy"); vo.setPassword("aaaaa");
/** Age를 30으로 변경 **/ Field field = ReflectionUtils.findField(vo.getClass(), "age"); ReflectionUtil.makeAccessible(field); ReflectionUtils.setField(field, vo, 30); ReflectionUtils.doWithFields(vo.getClass(), new FieldCallback() { @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtil.makeAccessible(field); Object value = ReflectionUtils.getField(field, vo); LOGGER.debug("{} :: {}", field.getName(), value); }
}); }
|
Spring framework에서 제공하는 ReflectionUtils를 사용하는 경우에는 doWithFields 메소드의 FileldCallback 함수를 재정의하여 사용한다.
private 필드에 대해 access를 허용하기 위해서 makeAccessilbe 메소드에 Filed를 파라미터로 전달한다.
Field의 값을 읽어오기 위해 getFiled 함수를 사용하며, 첫번째 파라미터는 Filed, 두번째 파라미터에 Value Object 객체를 넘겨준다.
'Java' 카테고리의 다른 글
Java에서 Shell호출 방법 (0) | 2018.07.05 |
---|---|
JVM GC 설정 (0) | 2018.06.07 |
JSP의 img, script에 jsessionid가 추가되는 경우 (0) | 2018.02.22 |
Html a tag function call (0) | 2018.02.20 |
CDI를 이용한 Java 개발 (0) | 2018.02.13 |