[Java] 리플렉션(Reflection) 예제

최대 1 분 소요

 1. 클래스내의 모든 메소드 정보 출력하는방법

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
       try {
 
                  Class TestClass = Class.forName("임포트한 클래스 파일 경로");
 
                  Method methods[] = TestClass.getDeclaredMethods();
 
        //검색한 클래스의 모든 메소드 정보를 methods 객체에 집어넣음
 
 
 
                      Log.d("테스트","============AppCompatActivity 메소드 목록===============");
 
                  for(int i=0; i<methods.length; i++){
 
                      Log.d("테스트","name : "+methods[i].getName());
 
                      Log.d("테스트","Declared Class : "+methods[i].getDeclaringClass());
 
        //검색한 클래스의 메소드의 이름, 선언된 클래스 출력
 
 
 
                      Class ParameterTypes[] = methods[i].getParameterTypes();
 
                      for(int j=0; j<ParameterTypes.length; j++){
 
                          Log.d("테스트","parm #"+j+" "+ParameterTypes[j]);
 
                      }
 
        //검색한 클래스의 메소드의 필요 파라메터들 출력
 
 
 
                      Class ExceptionTypes[] = methods[i].getExceptionTypes();
 
                      for(int j=0; j<ExceptionTypes.length; j++){
 
                          Log.d("테스트","Exception Types #"+j+" "+ExceptionTypes[j]);
 
                      }
 
        //검색한 클래스의 메소드의 예외타입들 출력
 
 
 
                      Log.d("테스트","return type : "+methods[i].getReturnType());
 
        //검색한 클래스의 메소드의 리턴타입 출력
 
 
 
                      Log.d("테스트","-----------------------------------");
 
 
 
                  }
 
              } catch (ClassNotFoundException e) {
 
                  Log.d("테스트","e.getMessage : "+e.getMessage());
 
                  Log.d("테스트","e.getLocalizedMessage : "+e.getLocalizedMessage());
 
                  Log.d("테스트","e.toString : "+e.toString());
 
                  e.printStackTrace();
 
              }
cs



2. 클래스내의 특정 메소드 호출하고 실행하는방법 (invoke)

->Method method.invoke(호출할 객체, 메소드 매개변수에 전달할 파라미터값)


1
2
3
4
5
6
7
Class class = Class.forName("클래스파일 경로");
 
Method method = class.getDeclaredMethod("메소드이름", 매개변수 타입.class);
 
int returnValue = (int) method.invoke(호출하려는 객체, 메소드 매개변수에 전달할 파라미터값);
 
System.out.println("return value: " + returnValue);
cs



3. Priviate 메소드에 접근해서 실행방법. method.setAccessible(true);

invoke 하기전에 메소드.setAccessible(true); 로 설정하고 invoke 실행


4. 그 외에 생성자, 필드 값을 가져올수도 있고, 필드값은 변경가능