JAVA/정리한 것

[ JAVA ] class.forName()

따갓 2022. 5. 18. 02:13
package east;
class Temp {	
	static{
		System.out.println("static");
	}	
	Temp(){
		System.out.println("print");
	}
	public void print(){
		System.out.println("print");
	}
	
}
public class Main{
	public static void main( String[] args ) throws Exception {
		//Class.forName("banana.Temp");
		Class<?> cls = Class.forName("east.Temp");
		Object obj = cls.newInstance();    // Class.forName("east.Temp").newInstance();
		System.out.println(obj.getClass().getName() );	// 결과 : east.Temp
	}
}
  • Class.forName("") : 문자열에 주어진 이름의 클래스를 강제로 '로딩'시킨다.
  • cls.newInstance() : cls에 해당하는 클래스의 인스턴스를 만든다. (new 없이 인스턴스 생성가능)
  • forName의 역할은 단지 Class 객체를 반환하는 것이 아니라 클래스 로더에 의해 그 클래스 객체가 로드된다는 것을 알 수 있었습니다.
package east;
import java.lang.reflect.Method;

class Temp{
	public void print(){
		System.out.println("print");
	}	
}
public class Main{
	public static void main( String[] args ) throws Exception {
		Temp t = new Temp();
		t.print();
		
		Class<?> cls = Class.forName("east.Temp");
		Object obj = cls.newInstance();
		System.out.println( obj );
		//
		Method mtd = cls.getMethod("print");
		mtd.invoke( obj );
	}
}
  •  Method mtd = cls.getMethod("print"); >> getMethod가 리턴하는 Method형 변수가 혹시 함수포인터인가?  >> 비슷하다. ( cls 에서 지정된 print 라는 이름의 함수를 호출할 수 있는 포인터를 제공한다 )
  • 함수호출( invoke 사용 )시 해당 인스턴스에 대한 포인터를 넣어주어야 한다.

[ 매개변수가 있는 함수를 호출하는 방법 ]

package banana;
import java.lang.reflect.Method;
class Temp{
	public void print(){
		System.out.println("Hello");
	}	
	public void print( int i ){
		System.out.println("Hello" + i + "입니다");
	}	
	public void print(int i, double j){
		System.out.println("Hello"+ i + "," + j );
	}
}
public class Main{
	public static void main(String[] args) throws Exception {
		Class<?> cls = Class.forName( "banana.Temp" );
		Object obj = cls.newInstance();		
			
		Method mtd = cls.getMethod( "print", int.class );
		mtd.invoke( obj , 100 ); // 함수(print)를 호출하면서 매개변수로 100을 넘긴다
		
		Method mtd2 = cls.getMethod( "print" , int.class, double.class );	

		Object rv = mtd2.invoke( obj, 100, 3.14 );
	}
}
  • Method mtd = cls.getMethod( "print", int.class ); >> cls에 선언된 메서드 중 이름이 print 이고 매개변수가 (int)로 선언된 함수포인터를 넘긴다.
  • 여기서 Class 라는 이름의 클래스의 정체는? : '선언된 class와 관련된 함수를 모아놓은 것이라고 보자'
package east;
import java.lang.reflect.Method;

class Temp{
	public void print( int i, int j ){
		System.out.println("Apple");
	}	
	public void print2(){
		System.out.println("Apple");
	}	
}

public class Main{
	public static void main( String[] args ) throws Exception {
		Class<?> cls = Class.forName("east.Temp");
		Object obj = cls.newInstance();		
		
		Method[] mtds = cls.getMethods();
		for( Method mtd : mtds ){ 
        	Class<?>[] temp = mtd.getParameterTypes();            
            for( Class<?> t : temp ) {
                System.out.println( t );
            }
		}
		
	}
}
  • Method[] mtds = cls.getMethods(); >> 클래스 내의 모든 메서드들에 대한 포인터를 배열 내에 저장한다.
  • Class<?>[] temp = mtd.getParameterTypes(); >> 매서드의 모든 매개변수들의 종류를 반환한다.

'JAVA > 정리한 것' 카테고리의 다른 글

[ JAVA ] 예외(Exception) 처리  (0) 2022.05.20
[ JAVA ] 어노테이션( Annotation )  (0) 2022.05.19
[ JAVA ] 정적( Static )  (0) 2022.05.16
[ JAVA ] 익명 클래스 ( Anonymous Class )  (0) 2022.05.16
[ JAVA ] 제너릭( Generic )  (0) 2022.05.16