早上好。我通过反射从类的字段中获取值。我通过参数获取对象,但是当我显示我得到的值时,它是空白的。我得到了属性,但没有获得值。从我注意到,它看起来好像没有捕获传递的对象的实例。谢谢你的帮助。
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();
}
}
}
}
答案 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);