反射机制中如何获得static final的serialVersionUID值

时间:2021-04-22 00:42:10
需求是我要做一个javabean转为xml格式的方法,现在我通过传递放有javabean的list数组,
在services中循环处理,通过反射把javabean的class得到,然后getDeclaredFields

for(Object bean : list) {
String root = bean.getClass().getSimpleName();
sb.append("<" + root.toUpperCase() + ">\n");
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
try {


field.setAccessible(true);
if(showlist.contains(field.getName().toUpperCase())) {
System.out.println(field.getName() + ">>>>>" + field.get(bean));
if("SERIALVERSIONUID".equals(field.getName().toUpperCase())) {

sb.append("<ID>" + field.get(bean) + "</ID>\n");
}else {
sb.append("<" + field.getName().toUpperCase() + ">" + field.get(bean) + "</"
+ field.getName().toUpperCase() + ">\n");
}
}


} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
sb.append("</" + root.toUpperCase() + ">\n");
}


我具体遇到的问题是在sb.append("<ID>" + field.get(bean) + "</ID>\n");这行,当我get(bean)的时候,获取到的是 3178596402696236227这个值,也就是下面这个变量:
private static final long serialVersionUID = 3178596402696236227L;
但是实际我是想取到存放在id中得string字符串,我使用了debug调试,当我走到最里面的if语句条件时,发现在bean中存在的id的值才是我想要的值,请问我该如何获取到,请对反射机制熟练地人帮解决下,100分感谢

3 个解决方案

#1


public Object get(Object obj)
           throws IllegalArgumentException,
                  IllegalAccessException返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中。 
基础字段的值是按以下方式获得的: 

如果基础字段是一个静态字段,则忽略 obj 变量;它可能为 null。 

否则,基础字段是一个实例字段。如果指定的 obj 变量为 null,则该方法将抛出一个 NullPointerException。如果指定对象不是声明基础字段的类或接口的实例,则该方法将抛出一个 IllegalArgumentException。 

如果此 Field 对象强制实施 Java 语言访问控制,并且基础字段是不可访问的,则该方法将抛出一个 IllegalAccessException。如果基础字段是静态的,并且声明该字段的类尚未初始化,则初始化这个类。 

否则,从基础实例字段或静态字段中检索该值。如果该字段是一个基本类型字段,则在返回前将该值包装在一个对象中,否则照原样返回。 

如果字段隐藏在 obj 的类型中,则根据前面的规则获得字段的值。 


参数:
obj - 从中提取所表示字段的值的对象 
返回:
对象 obj 中的所表示字段的值;在返回之前,基值包装在一个适当的对象中 

#2


A.java
public class A implements java.io.Serializable {
public static final long serialVersionUID = -5362330504532103641L;
}
TestA.java
 public class TestA {
public static void main(String[] args) throws Exception {
Class c = A.class;
java.lang.reflect.Field f = c.getDeclaredField("serialVersionUID");
long l = f.getLong(A.class.newInstance());
System.out.println("serialVersionUID:" + l);
}
}

#3


Long ll = l ;
ll.toString(),不就转成 string了,xml 中的文本 都是string 啊

#1


public Object get(Object obj)
           throws IllegalArgumentException,
                  IllegalAccessException返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中。 
基础字段的值是按以下方式获得的: 

如果基础字段是一个静态字段,则忽略 obj 变量;它可能为 null。 

否则,基础字段是一个实例字段。如果指定的 obj 变量为 null,则该方法将抛出一个 NullPointerException。如果指定对象不是声明基础字段的类或接口的实例,则该方法将抛出一个 IllegalArgumentException。 

如果此 Field 对象强制实施 Java 语言访问控制,并且基础字段是不可访问的,则该方法将抛出一个 IllegalAccessException。如果基础字段是静态的,并且声明该字段的类尚未初始化,则初始化这个类。 

否则,从基础实例字段或静态字段中检索该值。如果该字段是一个基本类型字段,则在返回前将该值包装在一个对象中,否则照原样返回。 

如果字段隐藏在 obj 的类型中,则根据前面的规则获得字段的值。 


参数:
obj - 从中提取所表示字段的值的对象 
返回:
对象 obj 中的所表示字段的值;在返回之前,基值包装在一个适当的对象中 

#2


A.java
public class A implements java.io.Serializable {
public static final long serialVersionUID = -5362330504532103641L;
}
TestA.java
 public class TestA {
public static void main(String[] args) throws Exception {
Class c = A.class;
java.lang.reflect.Field f = c.getDeclaredField("serialVersionUID");
long l = f.getLong(A.class.newInstance());
System.out.println("serialVersionUID:" + l);
}
}

#3


Long ll = l ;
ll.toString(),不就转成 string了,xml 中的文本 都是string 啊