Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java访问Intellij中包含双数组的对象数组中的数组元素_Java_Spring_Maven_Spring Boot_Intellij Idea - Fatal编程技术网

Java访问Intellij中包含双数组的对象数组中的数组元素

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始终具有相同的长度,并且相同的索引彼此相关,请参见上面的示例 代

背景故事:我有一个SpringBoot应用程序,它可以获取任何带有自定义注释的方法的输入参数。它将这些参数的类型放置在类数组clazz中,并将值放置在对象数组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)
}
选项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;
}