상수 탱크가 얼마나 알고 있나--class 파일 교체 무효로 인한 사고
1786 단어 상량가상 머신 로드 원리
그런데 최근 며칠 동안 나는 아주 이상한 문제를 발견했다.
원래의 클래스 파일을 바꾸는 것은 무효이고, 서버를 다시 시작하는 것도 무효입니다!
ps 실제 문제: 지불된 동기화 알림 주소와 비동기화 알림 주소는 하나의 인터페이스의 정적 상수에 기록된 것입니다. 이 파일을 수정한 후에 재배치합니다. 서버를 다시 시작해도 무효입니다. 프로젝트에 적용된 주소는 이전의 주소입니다.
일반적으로 우리가 사이트를 업데이트하는 것은 업데이트된 파일, 예를 들어 jsp,class 파일을 원래의class 파일로 바꾸면 된다.Tomcat과 같은 서버는 자동으로 핫 배포를 완료합니다.메모리가 넘치면 서버를 다시 시작하면 OK입니다.그러나 오늘, 나는 교체 후의class 파일은 어쨌든 효력이 발생하지 않는다는 것을 발견했다.
여러 가지 가능성을 생각해 봤습니다. Tomcat에서 WAR 패키지를 자동으로 해석하는 설정이 영향을 미치지 않을까요?Tomcat 안의 웹.xml 관련 모델에 영향이 있습니까?
반나절을 했지만 수정된class 파일은 여전히 작용할 수 없습니다.
나중에 드디어 밥ing에서 문제의 원인을 찾았다.
수정된 클래스 파일은 일반적인 클래스 파일과 달리 인터페이스 안의 정적 상수입니다.Java에서는 상수와 변수에 대한 처리가 다릅니다.상량은 번역 기간에 이미 확정된 것이다.즉, 프로젝트는javac를 거쳐class 파일로 컴파일된 후 상량은 응용에서 상량명의 형식으로 존재하는 것이 아니라 상량치의 형식으로 존재한다.
간단한 예:
내가 수정하기 전의 상수는 다음과 같다.
public interface Constant {
public static String notify ="www.baidu.com";
}
수정하면 다음과 같습니다.
public interface Constant {
public static String notify ="http://www.google.com.hk/";
}
프로그램에서 우리는 상수: Constant를 사용합니다.notify
그러나 자바에서 번역한 후에 이 상량을 사용하는 곳은 모두 www.baidu로 변했다.com.
그래서 저는 변경된 상량류를 교체했을 뿐, 프로젝트에서 상량을 사용하는 부분은 바뀌지 않았습니다. 여전히 www.baidu입니다.com
우리는 자바가 운행 기간에 클래스를 불러오는 것을 알고 있기 때문에, 자바는 항상 최신 버전의 클래스에 접근합니다.그러나 상량역에 대한 인용은 컴파일러에서 표시된 값으로 바뀐다.그래서 오늘의 문제도 생겼다.
그러니까 정적 상량은 우리가 사용할 때 반드시 신중해야 한다.일단 수정이 있으면 전체 항목을 다시 컴파일하여 교체해야 한다.
그럼, 나는 또 문제가 생겼다. 만약 내가 지금 위의 상수를null로 설정한다면, 이 파일만 바꾸면 어떨까?
즉, 다음과 같습니다.
public interface Constant {
public static String notify =null;
}
교체 후에도 위의 상황이 발생합니까?
답은 교체된 null이어야 한다.그 이유도 자바의 디자이너와 관련이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
상수 탱크가 얼마나 알고 있나--class 파일 교체 무효로 인한 사고드디어 한 차례의 수요와 디자인의 변경을 거쳐 프로젝트가 곧 출시될 것이다. 원래의 클래스 파일을 바꾸는 것은 무효이고, 서버를 다시 시작하는 것도 무효입니다! ps 실제 문제: 지불된 동기화 알림 주소와 비동기화 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.