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 |