我想知道是否有可能找出是否有一些serialVersionUID已經自動生成(由JVM)或者是否在類中明確定義了靜態的。是否有可能知道serialVersionUID是否自動生成?
任何線索,如果有可能做,如果是的話,如何?
我想知道是否有可能找出是否有一些serialVersionUID已經自動生成(由JVM)或者是否在類中明確定義了靜態的。是否有可能知道serialVersionUID是否自動生成?
任何線索,如果有可能做,如果是的話,如何?
使用reflection.Here的一個例子(我沒有檢查該字段的serialVersionUID確切的合同,雖然):
public class SerialTest {
private static class A implements Serializable {
private static final long serialVersionUID = 1L;
}
private static class B implements Serializable {
}
public static void main(String[] args) throws Exception {
System.out.println("A : " + containSerialVersionUID(A.class));
System.out.println("B : " + containSerialVersionUID(B.class));
}
private static boolean containSerialVersionUID(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals("serialVersionUID")
&& field.getType() == Long.TYPE
&& Modifier.isPrivate(field.getModifiers())
&& Modifier.isStatic(field.getModifiers())
&& Modifier.isFinal(field.getModifiers())) {
return true;
}
}
return false;
}
}
愚蠢的我,假設反射無法放棄靜態領域......謝謝! –
需要特別注意的是:不需要檢查private(儘管私有serialVersionUID仍然是一個好習慣) –
你是否嘗試通過自省檢查字段serialUID? 我不知道JVM是以這種方式分配的,還是隻是在生成時以不同的方式存儲它。
問候, 斯特凡
由於理論上正確的答案是「不」 ,你可能想指定爲什麼你需要這個區別。在某些情況下,可能有足夠好的啓發式方法。 – blubb
你在談論檢查字節流嗎? – bestsss
爲什麼這很重要?在這種情況下,JVM生成'serialVersionUID's? – home