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 를 값을 가져온다.