티스토리 뷰
반응형
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-문자열로-클래스-만들기
반응형
'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
링크
TAG
- 파이썬
- Python
- data component module
- data component
- https://www.tistory.com/auth/logout/
- angular router
- Java
- python3
- MySQL
- facebook login
- 파이썬3
- Router
- data grid component
- JPA
- JSON
- mobx
- jQuery
- Spring Boot
- Angular
- CSS
- localStorage
- React-router
- data gird component
- 페이스북 로그인
- Redux
- Spring
- JavaScript
- react
- data table component
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함