JAVA Programming
[56] 타입을 쓸수 없는 경우 동적로딩 reflect 프로그래밍
꾸준히개발하자
2020. 7. 20. 08:29
Person 클래스 생성
package classex;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(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;
}
public String toString() {
return name;
}
public static void main(String[] args) {
}
}
ClassTest 클래스
package classex;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
Person person = new Person("James");
System.out.println(person);
Class c1 = Class.forName("classex.Person"); // Person클래스를 동적 로딩
// 객체를 생성해주는데 Person 의 생성자 호출 리턴타입이 Object이니까 다운캐스팅
Person person1 = (Person) c1.newInstance();
System.out.println(person1);
Class[] parameterTypes = {String.class}; //parameterTypes를 가져오는데 class의 여러개를 쓰라는데
//class의 array 의 String.class 를 가져온다.
Constructor cons = c1.getConstructor(parameterTypes);
Object[] initargs = {"김유신"};
Person personLee =(Person)cons.newInstance(initargs); // 오브젝트의 array 를 가져온다.
System.out.println(personLee);
}
}
데이터 타입이 모두 바인딩 되어 자료형이 로딩된다.
실행중에 데이터 타입을 알고 binding 되는 방식이다.
바인딩된 c1으로 객체를 생성할수있는데 Person의 생성자를 호출하여 Object 를 다운캐스팅하여 만든다.
c1으로 생성자들을 알아낼수있다. getConstructor 메소드를 사용하여 파라미터 타입은
class 의 여러개를 쓰라는데 class 의 array의 String.class 를 가져온다.
인스턴스도 만들수있다.
만든 생성자 cons 를 newInstance 를 통해 오브젝트의 array 를 값을 가져온다.