2011-08-24 176 views
2

我想知道是否有可能找出是否有一些serialVersionUID已經自動生成(由JVM)或者是否在類中明確定義了靜態的。是否有可能知道serialVersionUID是否自動生成?

任何線索,如果有可能做,如果是的話,如何?

+3

由於理論上正確的答案是「不」 ,你可能想指定爲什麼你需要這個區別。在某些情況下,可能有足夠好的啓發式方法。 – blubb

+0

你在談論檢查字節流嗎? – bestsss

+0

爲什麼這很重要?在這種情況下,JVM生成'serialVersionUID's? – home

回答

2

使用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; 
    } 
} 
+0

愚蠢的我,假設反射無法放棄靜態領域......謝謝! –

+0

需要特別注意的是:不需要檢查private(儘管私有serialVersionUID仍然是一個好習慣) –

0

你是否嘗試通過自省檢查字段serialUID? 我不知道JVM是以這種方式分配的,還是隻是在生成時以不同的方式存儲它。

問候, 斯特凡

相關問題