자바 에서 transient 키워드 용법 분석

3730 단어
본 논문 의 사례 는 자바 에서 transient 키워드 의 용법 을 분석 하 였 다.모두 에 게 참고 하도록 공유 하 다.구체 적 인 분석 은 다음 과 같다.
자바 의 특징 은 직렬 화 입 니 다. 쉽게 말 하면 이 종 류 를 물리 적 공간 (물론 파일 로 존재 합 니 다) 에 저장 할 수 있 습 니 다. 그러면 로 컬 에서 이 파일 을 복원 할 때 그 자체 로 변환 할 수 있 습 니 다.이것 은 네트워크 의 일부 조작 을 크게 편리 하 게 할 수 있 지만 동시에 안전 문제 와 관련 되 기 때문에 클래스 안의 모든 것 을 저장 하 는 것 을 원 하지 않 는 다 (그 렇 기 때문에 다른 사람 은 직렬 화 를 통 해 클래스 안의 내용 을 알 수 있다). 그러면 우 리 는 transient 라 는 키 워드 를 사용 할 수 있다. 이것 은 임시 적 인 것 이다. 즉, 클래스 와 함께 현지 로 서열 화 되 지 않 는 다 는 뜻 이다.그래서 복원 하면 이 키워드 가 정의 하 는 변 수 는 더 이상 존재 하지 않 습 니 다.
일반적으로 우리 가 쓰 는 프로그램 은 특정한 정보 가 디스크 에 지속 적 으로 존재 하거나 저장 되 어 한 프로그램 이 같은 프로그램의 다른 실행 에 사용 하거나 사용 할 수 있 도록 요구 합 니 다. 이러한 지속 성 은 데이터베이스 에 쓰 거나 JAVA 를 이용 하여 이미지 직렬 화 에 대한 지원 을 포함 하여 몇 가지 방식 으로 이 루어 질 수 있 습 니 다. 우리 가 어떤 방법 을 선택 하 든,클래스 인 스 턴 스 의 지속 성 은 클래스 의 도 메 인 상 태 를 저장 함으로써 이 상 태 를 저장 합 니 다. 나중에 접근 하거나 사용 하여 같은 인 스 턴 스 를 만 들 수 있 도록 합 니 다. 그러나 모든 도 메 인 이 저장 되 어야 하 는 것 은 아 닐 수도 있 습 니 다. 인 스 턴 스 가 지속 되 었 을 때 내부 의 일부 도 메 인 은 지속 되 지 않 아 도 됩 니 다.컴 파일 러 가 지정 한 도 메 인 이 오래 저장 되 지 않 아 도 된다 는 것 을 trainsient 수정자 로 알려 줄 수 있 습 니 다.  우선 자바 serialization 코드 를 보 여 줍 니 다.

public class LoggingInfo implements java.io.Serializable 
{ 
  private Date loggingDate = new Date(); 
  private String uid; 
  private transient String pwd; 
  
  LoggingInfo(String user, String password) 
  { 
    uid = user; 
    pwd = password; 
  } 
  public String toString() 
  { 
    String password=null; 
    if(pwd == null) 
    { 
    password = "NOT SET"; 
    } 
    else 
    { 
      password = pwd; 
    } 
    return "logon info: /n  " + "user: " + uid + 
      "/n  logging date : " + loggingDate.toString() + 
      "/n  password: " + password; 
  } 
}

현재 우 리 는 이러한 인 스 턴 스 를 만 들 고 직렬 화 (serialize) 한 다음 에 이 직렬 화 대상 을 디스크 처럼 씁 니 다.

LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS"); 
System.out.println(logInfo.toString()); 
try 
{ 
  ObjectOutputStream o = new ObjectOutputStream( 
        new FileOutputStream("logInfo.out")); 
  o.writeObject(logInfo); 
  o.close(); 
} 
catch(Exception e) {//deal with exception}
To read the object back, we can write 

try 
{ 
  ObjectInputStream in =new ObjectInputStream( 
        new FileInputStream("logInfo.out")); 
  LoggingInfo logInfo = (LoggingInfo)in.readObject(); 
  System.out.println(logInfo.toString()); 
} 
catch(Exception e) {//deal with exception}

이 코드 를 실행 하면 디스크 에서 읽 기 (read - back (de - serializing) 대상 이 password 를 'NOT SET' 로 인쇄 하 는 것 을 알 수 있 습 니 다.이것 은 우리 가 pwd 역 을 transient 로 정의 할 때 기대 하 는 정확 한 결과 입 니 다.
이제 transient 도 메 인 에 대한 부주의 로 인 한 잠재 적 인 문 제 를 살 펴 보 자.만약 에 우리 가 클래스 정 의 를 수정 했다 고 가정 하면 transient 도 메 인 에 기본 값 을 제공 합 니 다. 코드 는 다음 과 같 습 니 다.

public class GuestLoggingInfo implements java.io.Serializable 
{ 
  private Date loggingDate = new Date(); 
  private String uid; 
  private transient String pwd; 
  
  GuestLoggingInfo() 
  { 
    uid = "guest"; 
    pwd = "guest"; 
  } 
  public String toString() 
  { 
    //same as above 
   } 
}

현재 GuestLoggingInfo 의 인 스 턴 스 를 뚫 고 디스크 에 기록 하고 디스크 에서 읽 으 면 읽 은 대상 이 password 를 'NOT SET' 로 인쇄 하 는 것 을 볼 수 있 습 니 다.디스크 에서 어떤 종류의 인 스 턴 스 를 읽 을 때 실제 적 으로 이러한 구조 함 수 를 실행 하지 않 고 이러한 대상 의 지구 화 상 태 를 불 러 오고 이 상 태 를 다른 대상 에 게 할당 합 니 다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기