Java:从属性名称获取值属性名称并在运行时键入unkown

问题描述

我有两个对象-输出(具有20个字段或属性)和一个对象o,其中某些字段(从1到5)。

我想比较对象o的所有这5个字段的值 在输出对象中包含它们的值。

说输出对象的属性为a到z。对象o具有a到c的属性,因此我想将output.a,output.b和output.c的值与o.a,o.b和o.c

进行比较

请注意,我不知道o.a,o.b和o.c是否存在,但我正在从字段中动态检索它们的属性:

下面是代码。我已经在行中标记了什么在工作,什么不在工作。我不知道如何键入强制转换,因为我不知道属性名称。

  private void CompareObjects(Output output,Object o) throws IllegalAccessException,NoSuchFieldException {

        Class<?>  r = o.getClass();
        Field[] fields = respclass.getDeclaredFields();
        for (Field field : fields) {

          String fname =   field.getType().getSimpleName();
          print((field.getName())output.getClass().getDeclaredField(fname));// NOT Working error line,not able to typecast it with the field.getName()
//          print(field.getType())output.getClass().getDeclaredField(fname)); // NOT Working

        }

解决方法

field.getName()将返回带有字段名称的字符串文字,因此很明显您无法对其进行强制转换

无论如何,我建议将两个对象都转换为HashMap s

<fieldName,fieldValue>

,然后检查output地图是否包含o地图

您可以轻松地执行此操作,例如使用此处描述的Jackson Mapper:Java introspection: object to map

,

我认为您应该使用两个循环来解决问题。

package com.test.dal;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

public class LTest {
    public static class Output {
        public String a;
        public int b;
        public boolean c;

        public Output(String a,int b,boolean c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }

    public static class Input {

        public int b;
        public boolean c;

        public Input(int b,boolean c) {
            this.b = b;
            this.c = c;
        }
    }

    public static void main(String[] args) throws Exception {
        Output output = new Output("a",1,false);
        Input input = new Input(1,false);
        CompareObjects(output,input);

    }

    private static void CompareObjects(Output output,Input o) throws IllegalAccessException,NoSuchFieldException {

        Field[] oFilds = o.getClass().getDeclaredFields();
        Field[] outputFilds = output.getClass().getDeclaredFields();
        for (Field ofield : oFilds) {

            String oFiledName = ofield.getName();
            String oFiledType = ofield.getType().getTypeName();

            for (Field outputField : outputFilds) {
                String outputFiledName = outputField.getName();
                String outputFiledType = outputField.getType().getTypeName();
                if (oFiledName.equals(outputFiledName) && oFiledType.equals(outputFiledType)) {
                    Object oFildObj = ofield.get(o);
                    Object outputFildObj = outputField.get(output);

                    if (oFiledType.equals("int")) {
                        int oFildInt = (int) oFildObj;
                        int outputFildInt = (int) outputFildObj;
                    } else if (oFiledType.equals("boolean")) {
                        boolean oFildInt = (boolean) oFildObj;
                        boolean outputFildInt = (boolean) outputFildObj;
                    }

                }

            }
        }
    }

   
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...