2

我正在考虑在 Object[] 数组中收集泛型方法的所有方法参数以用于日志记录。我知道使用方面可以更好地实现这一点,但是不允许使用它,并且如果可能的话,我正在寻找一种基于纯反射的方法

为了澄清,假设一个方法调用

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);
        }
    }
}
4

2 回答 2

2

您可以通过此获取参数类

Class  aClass = ...//obtain class object
Method method = aClass.getMethod("doSomething", null)
Class[] parameterTypes = method.getParameterTypes();
于 2012-07-27T05:24:05.557 回答
1

Object<Object>[], you rewrite/override the toString() methods on every object which you need to be logging.

于 2012-07-27T05:16:57.907 回答