2012-08-22 5 views
2

단위 테스트와 관련된 문제에 대해 제기 된이 질문을 보았지만 내 문제는 좀 더 일반적인 프로그래밍이며 몇 가지 조언이 필요했습니다.정적 클래스 필드를 초기 값으로 재설정

Java Reflection을 사용하여 특정 라이브러리의 일부인 필드의 값을 선택하고 변경하는 소프트웨어를 작성하고 있습니다. 그런 다음 라이브러리와 관련된 코드를 실행하고 필드에 적용된 효과를 기록한 다음 다른 필드로 이동합니다.

문제는 라이브러리 코드를 초기화하는 동작이 필요한 필드를 다시 설정했다는 것입니다. 그렇지 않은 것으로 밝혀졌습니다. 그리고 어떤 필드가 특별히 변경되었을 지 알지 못합니다 (많은 라이브러리가 있기 때문에 라이브러리가 상당히 큽니다). 그래서 내 전체, 반사 사용 코드를 다시 시작하지 않는 모든 필드를 다시 설정하는 방법이 필요합니다.

다른 질문에서 영향을받는 클래스를 다시로드하여 ClassLoaders가이 작업을 수행 할 수 있음을 알았습니다. 그러나이 의견은 또한이 클래스를 처음로드 한 ClassLoader를 만든 경우에만 작동하는 것으로 나타났습니다.

아무도 정상적인 Java 실행에서 클래스의 정적 필드를 안정적으로 재설정하는 방법을 제안 할 수 있습니까?

+0

저장 초기 값이 변경 및 복원 이전 값? – Jeffrey

+0

@Jeffrey - 할 수는 있지만 엄청나게 많은 숫자가 있습니다. 어떤 것이 바뀌 었는지는 알 수 없습니다. 전체 라이브러리를 반복하고 일부러 추측 한 모든 값을 반사적으로 저장하는 코드를 작성할 수 있습니다. – mtrc

+0

사실, 다른 클래스 로더를 사용하면 매번 정적 필드가 변경되지 않은 새로운 클래스로 시작할 수 있습니다. 그러나 그렇게하는 것이 줄어든 것은 의심의 여지가 없습니다. 어쩌면 정확히 무엇을하려하는지, 더 적절한 해결책을 찾기 위해 라이브러리가 무엇인지에 대해 더 자세히 설명해주십시오. –

답변

0
나는 당신이 클래스 로더에 동기화 전화 이제까지 정적 동기화 된 각 클래스의 방법 모든 속성을 재설정 때 쓰기, 말을

(getClass(). getClassLoader를())

+0

이것은 일종의, 결국 내가 뭘했다. 나는 작업을 시작할 때 스냅 샷을 찍어 시간이 지남에 따라 다시 설정합니다. 리바운드 라이브러리를 사용하여이 문제를 해결했습니다 (https://bitbucket.org/gigadot/rebound/wiki/Home). – mtrc

관련 문제