[Java] 리플렉션(Reflection) 예제
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. 그 외에 생성자, 필드 값을 가져올수도 있고, 필드값은 변경가능