2009-09-30 3 views
1

필자는 필요한 경우 클래스를 업데이트하고 Client 클래스를 인스턴스화하고 실행하는 Starter.class를 보유하고 있습니다.
Class의 인스턴스가 마지막 호출 이후에 수정되었는지 여부를 알 수 있습니까 (예인 경우)? 수정은 사소한 수정 일 뿐이며 대부분의 메소드는 동일하게 유지됩니다.Java의 클래스가 수정 자인지 여부를 판별 할 수 있습니까?

Client.class의 마지막 수정 날짜를 얻는 것이 해결책입니까? 그게 가능하니?

+2

수정 된 평균은 무엇입니까? 수정 된 "내부 상태"(인스턴스 변수가 변경되었습니다)? 또는 바이트 코드가 변경 되었습니까? –

+0

바이트 코드가 변경되었습니다. – Burkhard

+0

당신은 메모리에 인스턴스가 있다는 것을 의미합니다. 그런 다음 클래스 정의 (어떻게 ???)를 변경하고 인스턴스가 그 변경을 인식하도록 하시겠습니까 ??? – pgras

답변

2

난 당신이 다음과 같은 상황을 의미 가정합니다.

  • 클래스 A1 인스턴스에 연결합니다 : A2와 assoicate하는
  • 스타터 업데이트 A1 A1을이 작업을 수행하기 위해

(A2는 A1의 버전 2), 당신은 이미이없는 특수 클래스 로더? 특수 클래스 로더를 만드는 경우 클래스 로더를 사용하여 마지막으로 수정 한 시간을 추적 할 수없는 이유는 무엇입니까? OSGi를 사용하여 이것을 처리하고 있습니까?

추신.

@Burkhard, 인스턴스 파일간에 클래스 파일을 변경할 수 있으면 프레임 워크의 클래스 로더가 작업을 수행 할 가능성이 큽니다. 기본 클래스 로더는 클래스를 다시로드하지 않습니다. 한 가지 해결책은 해당 ClassLoader.loadClass (String) 메서드를 확장하여 super.loadClass (String)을 호출 한 후 마지막으로 업데이트 된 시간을 기록하는 것입니다. 물론 프레임 워크에서 사용자 정의 클래스 로더를 대체해야합니다 (대부분의 오픈 소스 프레임 워크가이를 지원합니다). 그러나 클래스 개체를 정기적으로 serialize하여 변경된 것으로 파악하고 시간을 기록하는 등의 트릭을 제안하지는 않습니다. 비싸다.

+0

클래스 로더 또는 업데이트 메서드를 만들지 않았습니다. – Burkhard

3

수정 된 내용은 무엇입니까? 어떤 속성이 변경된 것처럼?

이전에 할 수 있었던 한 가지 방법은 직렬화 API를 사용하여 개체의 딥 클론을 만드는 것입니다.

즉 : ObjectOutputStream을 만들고 ByteArrayOutputStream에 객체를 씁니다. 이제 주어진 시점에서 객체의 직렬화 된 버전 인 바이트 세트가 있습니다.

변경되었는지 확인하려는 경우 동일한 작업을 수행하고 두 바이트 배열을 비교할 수 있습니다. 이와

potentional 문제는 다음과 같습니다
1) 객체는 객체 속성과 객체 변경과 같은 다른 개체가있는 경우)
2 직렬화 할 필요가 고려 될 것이다 부모 객체도 변경되었습니다. (비록,이 바람직 할 수있다.)

여기에 일부 코드입니다 :

private static byte[] getObjectBytes(Object object) throws IOException { 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    new ObjectOutputStream (output).writeObject(object); 
    output.flush(); 
    return output.toByteArray(); 
} 

// These go in the object 
private byte[] digest; 
public void mark() { 
    digest = getObjectBytes(this); 
} 

public boolean hasChanged() { 
    return !Arrays.equals(getObjectBytes(this), digest); 
}