我正在寻找收集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);
}
}
}
答案 0 :(得分:2)
您可以通过此
获取参数类Class aClass = ...//obtain class object
Method method = aClass.getMethod("doSomething", null)
Class[] parameterTypes = method.getParameterTypes();
答案 1 :(得分:1)
Object<Object>[],
您在需要记录的每个对象上重写/覆盖toString()
方法。