【问题标题】:Java : Getting the Values from the Attribute names (attributes name and type unkown at runtime)Java:从属性名称中获取值(属性名称和类型在运行时未知)
【发布时间】:2020-09-09 07:05:40
【问题描述】:

我有两个对象 - 输出(有 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

        }

【问题讨论】:

    标签: java reflection


    【解决方案1】:

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

    无论如何,我的建议是将两个对象都转换为HashMaps

    <fieldName, fieldValue>
    

    然后检查output映射是否包含o映射

    您可以轻松地做到这一点,例如使用此处描述的 Jackson Mapper:Java introspection: object to map

    【讨论】:

    • err 我在 Android 上,所以 Beaninfo 不会工作。寻找动态类型转换方式。
    • 我说的不是“Bean 信息”,而是 Jackson 映射器 - 看看该主题的第二个答案
    • 好吧,在我的情况下,属性的数量可能超过 2 个。
    • 它有什么变化?将对象映射到地图将处理任意数量的字段、参数等(只是您需要更多地图来检查)
    • 同意@m.antkowicz,您可以将两个对象都转换为地图,并比较每个地图的键值。
    【解决方案2】:

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

    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;
                        }
    
                    }
    
                }
            }
        }
    
       
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 2019-06-13
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2010-09-14
      • 2018-11-16
      • 2023-03-16
      • 2011-10-02
      相关资源
      最近更新 更多