Java访问Intellij中包含双数组的对象数组中的数组元素
背景故事:我有一个SpringBoot应用程序,它可以获取任何带有自定义注释的方法的输入参数。它将这些参数的类型放置在类数组clazz中,并将值放置在对象数组obj中 这是广义的,因此obj中的元素可以是数组,例如:Java访问Intellij中包含双数组的对象数组中的数组元素,java,spring,maven,spring-boot,intellij-idea,Java,Spring,Maven,Spring Boot,Intellij Idea,背景故事:我有一个SpringBoot应用程序,它可以获取任何带有自定义注释的方法的输入参数。它将这些参数的类型放置在类数组clazz中,并将值放置在对象数组obj中 这是广义的,因此obj中的元素可以是数组,例如: clazz = {int, java.lang.String, [D} obj = {2, "Foobar", [3.1415, 2.718]} 我试图用下面的代码打印出obj中的所有元素。请注意,clazz和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)
}
选项1:对于这个clazz和obj,代码可以编译,但是当代码到达Double数组时,它不能被转换回一个对象数组,因为Double扩展了Object
选项2:这一次,由于语法错误,代码甚至没有编译:Arrays.deepToString需要一个对象数组,但在运行之前,语法检查器只看到对象。直到运行之后,对象中包装的Double[]才被发送到堆栈中
这对于其他数据结构(如Hashmap、ArrayList)也是一个问题
有什么方法可以获取objecto的元素吗?我无法控制哪些原语类型或对象是注释方法的输入,因此更改clazz和obj不是一个选项
编辑:提供clazz ie类和obj ie参数的Spring引导类
@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依赖项中找到了解决方案,并将其发布到此处。如果我理解正确,您可以使用包装器类并打印它的toString
class Scratch {
public static void main(String[] args) {
Double[] objects = {2.02,2.22,2.13};
System.out.print(new Foo(objects));
String[] strings = {"array","of", "strings"};
System.out.print(new Foo(strings));
}
public static class Foo{
private Object[] objects;
public Foo(Object[] objects){
this.objects=objects;
}
@Override
public String toString() {
return "Foo{" +
"objects=" + Arrays.toString(objects) +
'}';
}
}
}
您提到您无法控制它是否是原语,但它们不会被传递到私有void othermethodClass[]clazz,Object[]obj,因为它们不会是对象数组。为我自己的帖子找到了一个解决方案。为了将来的参考,事实证明有一个Maven Jackson依赖项可以做到这一点
@Autowired
com.fasterxml.jackson.databind.ObjectMapper objectMapper;
//...other methods and variables
private String ObjArrayDisplay(Object o, Class c){
String returnValue = null;
try {
returnValue = objectMapper.writeValueAsString(o);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return returnValue;
}
Java是一种强类型语言,所以这样做总是很棘手的。使用这些clazz和object数组,您到底想实现什么?也许有更好的数据结构来存储它们?它是Spring Aspect类的输出,带有@Around注释,可以从任何方法获取输入参数使用自定义注释进行注释。这是正在讨论的类,它为我提供了clazz和obj:Edit,现在还添加到原始PostaSpect AtComponent AtGetter公共类流{@Autowired SubscriptionIntegration SI;private class[]类;private Object[]参数;私有对象返回值=开始@Around@annotationTrackFlow公共对象TrackFlowProceedingJoinPoint joinPoint抛出可丢弃{CodeSignature cs=CodeSignature joinPoint.getSignature;classes=cs.getParameterTypes;params=joinPoint.getArgs;Object-procedue=joinPoint.procedue;returnvalue=procedue;return-procedue;}ObjectArray obj可以包含从原语到对象再到对象数组的任何内容。在我的原始帖子中,我提到了obj中的双数组元素如何由于继承而无法转换回对象数组。我不确定我是否理解。双[]不是对象[],但双[]是对象[].Int是基元,Integer不是。因此,如果您有一个参数为Object[]objects的方法,并且尝试传递double[]如果你对原语的理解在技术上是正确的,尽管java将分配给对象的原语转换为它们的对象形式,因此转换为对象数组的原语数组在功能上是相同的,可以编译。无论如何,我找到了解决问题的方法。
@Autowired
com.fasterxml.jackson.databind.ObjectMapper objectMapper;
//...other methods and variables
private String ObjArrayDisplay(Object o, Class c){
String returnValue = null;
try {
returnValue = objectMapper.writeValueAsString(o);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return returnValue;
}