(2024-10) 스파르타 내일배움캠프 - 백엔드/Java Reflect
Field 제어
by 어뫄어뫄
2024. 11. 27.
import java.lang.reflect.Field;
public class ReflectionDemo {
public static void main(String[] args) {
try {
Person person = new Person("John Doe", 30);
printClassFieldsInfo(person);
setFieldValue(person, "age", 35);
System.out.println("Updated Person: " + person);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void printClassFieldsInfo(Object obj) {
Class<?> clazz = obj.getClass();
System.out.println("Class Name: " + clazz.getName());
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
try {
System.out.println(String.format("Field Name: %s, Type: %s, Value: %s",
field.getName(),
field.getType().getName(),
field.get(obj)));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public static void setFieldValue(Object obj, String fieldName, Object value) {
try {
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
public static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + '\'' + ", age=" + age + '}';
}
}
}
- getDeclaredField(String name)
- getDeclaredFields()
- getName()
- 설명: 필드의 이름을 반환합니다. Field 객체에서 호출할 수 있습니다.
- 용법:
-
field.getName()
- getType()
- isSynthetic()
- 설명: 필드가 합성 필드인지 여부를 확인합니다. 합성 필드는 주로 컴파일러에 의해 생성된 필드로, 일반적으로 개발자가 직접 생성한 필드가 아닙니다.
- 용법:
-
field.isSynthetic()
- get(Object obj)
- 설명: 주어진 객체에서 필드의 값을 가져옵니다. 해당 필드가 static인 경우 null을 전달하여 호출할 수 있습니다.
- 용법:
-
field.get(instance)