BackEnd/Java
String(문자열)으로 Method(메소드) 호출
철철22
2018. 8. 10. 10:27
반응형
Java를 사용하다가 문뜩 String을 파라미터로 받아서 Method를 호출할 수 있는지 궁금해졌다.
그리고 검색을 해보니 Java에서 그 방법이 있어 공유한다.
사용방법은 밑의 예제와 같다.
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
String TestClass = "ADSA"; // 원래는 패키지 경로까지 적어야 하나 같은 default 경로라 생략
try {
// 이것만 선언할 경우 static만 호출 => 여기서 System.out.println("난 static블럭에 있는 함수"); 호출
Class testClass = Class.forName(TestClass);
Object newObj = testClass.newInstance(); // 클래스의 받아온 정보를 기반으로 객체를 생성
Method m = testClass.getMethod("show", boolean.class, Integer.class); // 메소드 불러오기
m.invoke(newObj, true, 3); // 메소드 호출 A 3 출력
// testClass.getMethod("A").invoke(newObj); A가 생성되었습니다. public일 때
m = testClass.getDeclaredMethod("A");
m.setAccessible(true); // private를 접근하기 위해서는 getDeclaredMethod 뒤에 해줘야 한다.
m.invoke(newObj); // A가 생성되었습니다.
} catch (Exception e) {
}
}
}
class ADSA {
private void A() {
System.out.println("A가 생성되었습니다.");
}
public void show(boolean showOK, Integer a) {
if (showOK)
System.out.println("A " + a + " 출력");
}
static {
System.out.println("난 static블럭에 있는 함수");
}
}
여기서 신기한점은
getDeclaredMethod 이다
이 메소드를 자세히 들어가 보면 아래와 같이 선언되어 있다.
@CallerSensitive
public Method getDeclaredMethod(String name, Class... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
}
return method;
}
이 메서드는 불러오려는 메서드가 priavte 속성일 때 사용하는 메서드이다.
하지만 불러올 뿐이지 사용을 하기 위해서는
setAccessble을 true로 설정해줘야 사용할 수 있다.
<!-- 2018/8/27 추가 -->
위의 예제들이 reflection을 사용한 예제들이다.
나중에 reflection에 대해 공부도 해봐야겠다.
출처 및 참고
http://sks3297.tistory.com/entry/JAVA-문자열로-클래스-만들기
반응형