2012-07-27 5 views
2

로깅 목적으로 Object [] 배열의 제네릭 메소드의 모든 메소드 매개 변수를 수집합니다. 나는이 더 나은 측면을 사용하여 달성되는 것을 알고 있어요,하지만 그것을 사용하는 허용하고와Object [] 배열의 모든 메소드 args 수집

class A { 
    foo(int a, Object b){ 

    } 
} 

을 감안할 때 메소드 호출을 가정하면, 을 명확히 할 수

경우 순수한 반사 기반의 접근 방식을 찾고 있어요 A의 객체 인스턴스는 'foo'메서드 내에서 전달 된 인수를 동적으로 결정할 수 있습니까? 필자는 java.lang.reflect에서 API를 찾거나 주석을 찾은 것 같습니다.

편집 : 현재 로깅을 위해 아래 구현을 사용합니다. 그러나 배열을 호출하기 전에 배열의 모든 메소드 매개 변수를 수집하는 것이 지루하고, 이것이 어떻게 든 유추 될 수 있는지 궁금해하고 있습니다. 난 당신이 다시 측면

private static final ConcurrentMap<Class, Method[]> METHODS = new ConcurrentHashMap<Class, Method[]>(); 
protected void log(Class clazz, String methodName, Object[] args) { 
    Method[] methods = METHODS.get(clazz); 
    if (methods==null){ 
     methods = clazz.getDeclaredMethods(); 
     METHODS.put(clazz, methods); 
    } 

    for(Method method:methods){ 
     if (method.getName().equals(methodName)){ 
      StringBuilder builder = new StringBuilder(methodName + '('); 
      int i=0; 
      for (Class type:method.getParameterTypes()){ 
       builder.append(type.getSimpleName()) 
         .append(" [") 
         .append(args[i++]) 
         .append("] ,"); 
      } 
      String str = StringUtils.removeEnd(builder.toString(), ",") + ")"; 
      LoggerFactory.getLogger(clazz).info(str); 
     } 
    } 
} 
+0

에 의해 매개 변수의 수업을받을 수 있나요? –

+0

또 다른 foo가 주어지면 다른 서명'foo (double d) {logMyParms (this); ...}'. 'logMyParms (this)'가 어떻게 쓰여지는지 묻고 있습니까? –

답변

1

Object<Object>[], 이외의 어떤 제안/라이브러리를 찾고 있어요/당신이 로그인 할 필요가있는 모든 개체에 toString() 메소드를 오버라이드 (override).

2

당신이 예상 출력은 무엇을 것이

Class aClass = ...//obtain class object 
Method method = aClass.getMethod("doSomething", null) 
Class[] parameterTypes = method.getParameterTypes(); 
관련 문제