language/java

[Java] Reflection을 이용하여 invoke() 로 메소드 동적호출

zincah 2023. 6. 11. 23:58
반응형
Reflection 이란

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 필드들에 접근할 수 있는 자바 API

자바는 정적인 언어이기 때문에 구체적인 클래스 타입을 알지 못하면 어떤 부분을 실행해야 하는 지 모르기 때문에 이런 문제를 해결하여 동적으로 호출할 수 있게 해주는 것이 Reflection 입니다.

 

invoke()로 메소드 동적 호출하기

예제 ) 부모 클래스에 있는 특정 메소드와 자식 클래스에 오버라이드 되어 존재하는 같은 메소드 중에서 자식 클래스의 메소드를 호출하고 싶을 때 invoke를 사용하여 동적으로 호출하는 로직에 대해 작성해보았습니다.

 

클래스 구성

  • invokeEx.java
  • GlobalClass.java 
  • ParentClass.java
  • ChildClass.java

클래스 역할

- ParentClass.java 는 GlobalClass 라는 인터페이스의 메소드를 구현합니다.

- ChildClass.java 는 ParentClass.java를 상속받습니다.

- invokeEx.java 는 ChildClass의 메소드를 동적호출합니다.

 

GlobalClass.java
public interface GlobalClass {
    void mainProcess();
}

 

ParentClass.java 
public abstract class ParentClass implements GlobalClass{

    String name = "zincah";
    int age = 28;

    public ParentClass(String param1) {
        System.out.println("parent class 생성자 / 매개변수 [");
    }

    public ParentClass(String param1, String param2, String param3){
        System.out.println("parent class 생성자 / 매개변수 [" + param1 + "], [" + param2 + "], [" + param3 + "]");
    }

    @Override
    public void mainProcess(){
        System.out.println("this is parent class..");

        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }
}

 

ChildClass.java
public class ChildClass extends ParentClass{ // ParentClass 상속

    public ChildClass(String param1) {
        super(param1);
        System.out.println("child class 생성자 / 매개변수 [" + param1 + "]");
    }

    public ChildClass(String param1, String param2, String param3){
        super(param1, param2, param3);
        System.out.println("child class 생성자 / 매개변수 [" + param1 + "], [" + param2 +"], [" + param3 + "]");
    }

    @Override
    public void mainProcess() {

        System.out.println("this is child class..");

        System.out.println("child 이름 : " + name);
        System.out.println("child 나이 : " + age);
    }
}

 

InvokeEx.java
package lang.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class InvokeEx {

    static String processName = "mainProcess";
    static String class_name = "lang.study.ChildClass";

    // 전달 변수
    static String param1 = "paramOne";
    static String param2 = "paramTwo";
    static String param3 = "paramThree";

    public static void main(String[] args) {

        System.out.println("invoke start...");

        try{

            Class<GlobalClass> cls = (Class<GlobalClass>)Class.forName(class_name); // ChildClass

            // String.class로 3개의 매개변수를 가지는 생성자 호출 
            Constructor<GlobalClass> constructor = cls.getDeclaredConstructor(new Class[] {String.class, String.class, String.class});
            Object instance = constructor.newInstance(new Object[] {param1, param2, param3});
            
            Method paramMethod = instance.getClass().getDeclaredMethod(processName); // mainProcess 메소드 
            paramMethod.invoke(instance); // mainProcess 메소드 동적 호출 

        }catch (Exception e){

            System.out.println("error 발생");
            e.printStackTrace();

        }

        System.out.println("invoke end...");

    }
}

< 실행 결과 > 

위의 결과를 통해 자식 클래스(지정한 클래스)의 mainProcess() 메소드를 동적호출하는 것을 확인할 수 있었습니다.

반응형