背景故事:我有一个 Spring Boot 应用程序,它可以获取使用自定义注释进行注释的任何方法的输入参数。它将这些参数的类型放在 Class Arrayclazz中,并将值放在 Object 数组obj中。
这是通用的,因此 obj 中的元素可以是数组,例如:
clazz = {int, java.lang.String, [D}
obj = {2, "Foobar", [3.1415, 2.718]}
我正在尝试使用以下代码打印出 obj 中的所有元素。请注意, clazz 和 obj 始终具有相同的长度,并且相同的索引彼此相关(参见上面的示例)。
代码检查对象是否是一个数组,而不是打印类似 [D@431621
private void othermethod(Class[] clazz, Object[] obj){
for(int i =0 ; i<clazz.length;i++){
if(clazz[i].isArray()){
System.out.println(ObjArrayDisplay(obj[i], clazz[i]));
}
else{
System.out.println(obj[i].toString());
}
}
}
private String ObjArrayDisplay(Object o, Class c){
//Option 1. return Arrays.deepToString((Object[])o);java.lang.ClassCastException: [D cannot be cast to [Ljava.lang.Object;
//Option 2. return Arrays.deepToString(c.cast(o)); deepToString (java.lang.Object[]) in Arrays cannot be applied to (java.lang.Object)
}
这就是问题所在。
让我们回到示例值:
clazz = {int, java.lang.String, [D}
obj = {2, "Foobar", [3.1415, 2.718]}
选项 1:对于这个 clazz 和 obj,代码可以编译,但是当代码到达 Double 数组时,它不能被强制转换回 Object 数组,因为 Double 扩展了 Object。
选项 2:由于语法错误,这次代码甚至无法编译:Arrays.deepToString 需要一个 Object 数组,但在运行之前,语法检查器只能看到 Object。直到运行时之后,包装在 Object 中的 Double[] 才被发送到堆栈中。
这对于 Hashmap、ArrayList 等其他数据结构也会有问题。
有没有办法得到Object o的元素?我无法控制哪些原始类型或对象是注释方法的输入,因此更改 clazz 和 obj 不是一种选择。
编辑:提供 clazz(即类)和 obj(即参数)的 Spring Boot 类
@Aspect
@Component
@Getter
public class Flow {
@Autowired
SubscriptionsIntegration SI;
private Class[] classes;
private Object[] params;
private Object returnvalue = "Start";
@Around("@annotation(TrackFlow)")
public Object TrackFlow(ProceedingJoinPoint joinPoint) throws Throwable{
CodeSignature cs = (CodeSignature) joinPoint.getSignature();
classes = cs.getParameterTypes();
params = joinPoint.getArgs();
Object proceed = joinPoint.proceed();
returnvalue = proceed;
return proceed;
}
}
编辑 2:在一个不起眼的 maven 依赖项中找到了解决方案,并将其发布在这里。
精慕HU
慕码人8056858
相关分类