티스토리 뷰

반응형

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에 대해 공부도 해봐야겠다.





출처 및 참고


https://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a-string


http://sks3297.tistory.com/entry/JAVA-문자열로-클래스-만들기


https://code.i-harness.com/ko/q/274ca

반응형

'BackEnd > Java' 카테고리의 다른 글

cmd에서 java 실행  (0) 2018.10.01
string, stringbuffer, stringbuilder 차이점  (0) 2018.09.04
HTTP 예외처리  (0) 2018.08.03
java bufferedreader BufferedWriter  (0) 2018.07.20
즉시로딩과 지연로딩, 컬렉션 래퍼  (0) 2018.07.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함