리플렉션을 사용하여 어떤 필드들이 존재하는지 검사할 수 있습니다.
public class Person {
public String name;
protected int age;
private int phoneNum;
String personNum;
}
"getDeclaredFields()"
getgetFields() 메서드는 pulblic으로 선언된 필드만 조회가 가능하기 때문에 getDeclaredFields() 메서드를 사용해보겠습니다.
public static void main(String[] args) {
Class<Person> clazz = Person.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
}
결과
name
age
phoneNum
personNum
생성자를 통해 인스턴스를 생성. 필드를 조회할 때는 필드를 조회하는 메서드를 사용했고, 이번엔 생성자를 가져오는 메서드를 사용한다.
public class Person {
private String name;
private int age;
public Person() {}
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
"getConstructor()"
타입을 명시하여 원하는 생성자를 조회할 수 있습니다. 해당되는 생성자가 없을 수도 있기 때문에 try-catch 문을 사용해야 합니다.
Class<Person> clazz = Person.class;
try {
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
"newInstance()"
생성자를 가져왔다면 newInstance() 메서드를 사용하여 인스터를 생성할 수 있습니다.
Class<Person> clazz = Person.class;
try {
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person person = constructor.newInstance("호호맨", 20);
} catch (Exception e) {
e.printStackTrace();
}
public 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 "이름 : " + this.name + ", 나이 : " + age;
}
}
"getMethod()"
toString은 pulbic 메소드이므로 getDeclaredMethod()메소드를 사용하지 않아도 된다.
Class<Person> clazz = Person.class;
try {
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person newPerson = constructor.newInstance("호호맨", 20);
Method toString = newPerson.getClass().getMethod("toString");
} catch (Exception e) {
e.printStackTrace();
}
"invoke()"
invoke() 를 사용하여 조회해온 toString() 메서드를 실행시켜보겠습니다.
public static void main(String[] args) {
Class<Person> clazz = Person.class;
try {
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person newPerson = constructor.newInstance("호호맨", 20);
Method toString = newPerson.getClass().getDeclaredMethod("toString");
String result = (String)toString.invoke(newPerson);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
결과
이름 : 호호맨, 나이 : 20