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() 메소드를 동적호출하는 것을 확인할 수 있었습니다.
반응형