在物件複製的過程中,可能會有些敏感欄位的資料不能被複製,例如會員資料的密碼。
此時可以透過 transient 關鍵字對該欄位進行標記,標記後再進行 Clone 時將不會複製該欄位之內容。
( 此方法只有在物件是利用 序列化複製時 有效 )
首先製作一個含有敏感欄位的物件,並將其密碼設定為 transient 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
public class Login implements Serializable{ private static final long serialVerionUID = 12855161761717331L; private String username; private transient String password; //only work on Serializable public Login(String username,String password) { this.username = username; this.password = password; } @Override public String toString() { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); sb.append("使用者名稱 : " + username); sb.append("密碼 : " + password); return sb.toString(); } @Override protected Login clone() { // TODO Auto-generated method stub Login obj = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); oos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); try { ObjectInputStream ois = new ObjectInputStream(bais); obj = (Login) ois.readObject(); ois.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return obj; } } |
然後透過以下程式碼測試是否有成功避免敏感資訊被複製:
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) { Login login = new Login("Lung yu tsai", "tygr123456"); System.out.println("輸出原始資訊"); System.out.println(login.toString()); Login login2 = login.clone(); System.out.println(login2.toString()); } } |
實驗結果如下圖,從圖中可以看到密碼沒有被複製,字串值為null。
完整專案範例 (連結)
實驗個欄位之預設值如下圖所示:
文章標籤
全站熱搜