反射JAVA的问题

时间:2017-05-17 11:48:13

标签: java reflection

早上好。我通过反射从类的字段中获取值。我通过参数获取对象,但是当我显示我得到的值时,它是空白的。我得到了属性,但没有获得值。从我注意到,它看起来好像没有捕获传递的对象的实例。谢谢你的帮助。

public static void transformarCamposCaixaAlta(BaseModel bm) {
    Class<?> classe = bm.getClass();
    for(Field item : classe.getDeclaredFields()) {
        item.setAccessible(true);

        if (item.getType() == BaseModel.class) {
            try {
                transformarCamposCaixaAlta((BaseModel) item.get(bm));
            } catch (IllegalArgumentException | IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if (item.isAnnotationPresent(FieldUpperCase.class)) {
            try {
                if(item.get(bm) != null) {

                    System.out.println("Valor: "+ item.get(bm).toString() + " Tipo: "+ item.getName());
                    System.out.println("------");
                    item.set(bm, ((String)item.get(bm)).toUpperCase());
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

2 个答案:

答案 0 :(得分:0)

我建议您尝试简化您的示例,并在每一步打印或记录,以查看它出错的地方。没有你的课程或注释,说起来有点困难,但你发布的所有内容看起来都是正确的。 您是否能够发布BaseModel类和注释,或者如果它们是复杂的类,则可以发布如下的简化示例。

也许这个基本的例子可以帮助你走上正轨:

public static void basicReflection(Object obj) throws IllegalAccessException {
    Class<?> objClass = obj.getClass();
    System.out.println("obj: " + obj.getClass());

    Field[] fields = objClass.getDeclaredFields();
    for(Field field : fields) {
        field.setAccessible(true);
        System.out.println("Field: " + field.getName() + " value: " + field.get(obj));
        if (field.getType() == Bar.class) {
            System.out.println("Field is a Bar");
        }
    }
}

一些基本的POJO:

public class Foo {
    public Foo(){}
    private Integer someInt = 123;
    private Long someLong = 987654321L;
    private String someString = "qwertyuiop";
    private Bar bar = new Bar();
}

调用类进行反射的示例:

public class Main {
    public static void main(String[] args) throws Exception {
        Foo foo = new Foo();
        basicReflection(foo);
    }
}

产生的控制台输出:

obj: class com.kaitait.reflection.Foo
Field: someInt value: 123
Field: someLong value: 987654321
Field: someString value: qwertyuiop
Field: bar value: com.kaitait.reflection.Bar@61bbe9ba
Field is a Bar

您可能还会发现this post有帮助。

答案 1 :(得分:0)

非常感谢@Kai的帮助,我使用了instanceof来检查每个对象,我不知道为什么我可以得到对象的实例并且有一个变量类,我把它放在其中一个while中用于每次交互它获取superClass,直到它为null。非常感谢你的帮助。

Class classes = bm.getClass();

    do {
        for(Field item : classes.getDeclaredFields()) {
            item.setAccessible(true);
            try {
                if (item.get(bm) != null) {
                    if (item.get(bm) instanceof BaseModel) {
                        try {
                            if (!item.isAnnotationPresent(Transient.class))
                            transformarCamposCaixaAlta(item.get(bm));
                        } catch (IllegalArgumentException | IllegalAccessException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            } catch (IllegalArgumentException | IllegalAccessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            if (item.isAnnotationPresent(FieldUpperCase.class)) {
                try {
                    if(item.get(bm) != null) {
                        item.set(bm, ((String)item.get(bm)).toUpperCase());
                    }
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    } while((classes = classes.getSuperclass()) != null);