programing

핫 스왑 메커니즘을 통해 런타임에 메서드 변경

nasanasas 2020. 12. 31. 08:29
반응형

핫 스왑 메커니즘을 통해 런타임에 메서드 변경


단 하나의 클래스로 구성된 간단한 Java 프로그램이 있다고 가정합니다.

public class HelloWorld {

   private static void replacable(int i) {
      System.out.println("Today is a nice day with a number " + i);
   }        

   public static void main(String[] args) throws Exception {
      for(int i = 0; i < 100000; ++i) {
      replacable(i);
      Thread.sleep(500);
   }
}

컴파일되고 실행 된 후 출력은 다음과 같습니다.

오늘은 숫자 0의 좋은 날입니다

오늘은 숫자 1로 좋은 날입니다

오늘은 숫자 2와 함께 좋은 날입니다

오늘은 숫자 3과 함께 좋은 날입니다

...

내 질문 : replacable런타임에 메서드 를 바꿀 수있는 방법이 있습니까 (또는 수평선에 있습니까)? HelloWorld의 새 버전으로의 다른 버전을 작성 replacable하고 컴파일 한 다음 이미 실행중인 JVM에서 이전 버전을 작성하는 것과 같은 것이 있습니까?

따라서 다음과 같이 새 버전을 작성하면 :

private static void replacable(int i) {
   System.out.println("Today is an even nicer day with a number " + i);
}  

내가 이것을 할 수있는 Erlang의 핫 코드 스와핑 과 비슷한 것이 있습니까?

  1. 오리지널 프로그램 실행
  2. 수정 된 버전 작성
  3. 명령 줄 프로그램을 사용하여 실행중인 JVM에 연결하고 기존 방법을 바꿉니다.

따라서 런타임 중에 다음이 발생합니다.

오늘은 15000 번의 좋은 날입니다

오늘은 숫자 15001의 좋은 날입니다.

오늘은 숫자 15002로 더 좋은 날입니다.

오늘은 숫자 15003으로 더 좋은 날입니다.

...

위의 프로그램은 독립형이고 표준 Java SE 환경에서 실행되며 클래스 경로에는 다른 것이 없으므로 거의 Hello 월드 스타일 프로그램이라고 가정합니다.

참고 : 바이트 코드 조작 ( cglib ), aspectJ , jRebel , JMX , Java EE에서 메소드 핫 스와핑 등의 기술이 존재한다는 것을 알고 있지만, 제가 생각하는 것은 아닙니다. 얼랭을 생각해보십시오.


오픈 소스 HotSpot VM 또는 상용 JRebel IDE 플러그인을 사용하여 쉽게 목표를 달성 할 수 있습니다 ( 여기에서 비교 표보기 ).


클래스 로더를 통해 할 수 있습니다. 예를 들어 개발 중에 페이지를 수정할 때 페이지를 다시로드하는 tomcat과 같은 Servlet 컨테이너에 익숙한 경우입니다. 다음은 java에서 동적 코드를 만드는 방법에 대한 훌륭한 설명입니다 . 로드뿐만 아니라 소스 컴파일도 즉석에서 설명합니다. 활용하려는 코드를 다시로드하는 모든 전략에 다루는 개념을 적용 할 수 있어야합니다.


나는 많은 프로젝트 에서이 핫스왑 개미 작업사용 했습니다. 대상 Java 애플리케이션은 Ant, Eclipse, 명령 프롬프트 또는 적절한 포트가 열린 상태에서 디버그 모드로 실행되는 한 다른 방법을 통해 실행할 수 있습니다. 링크 된 페이지는 Ant를 통해이를 수행하는 방법에 대한 지침을 제공합니다.

변경 사항이 구조적이지 않은 한 원하는 수의 클래스를 핫스왑 할 수 있습니다. 메서드 본문은 일반적으로 쉽게 핫스왑됩니다. 쉘 또는 Eclipse를 통해 ant 스크립트를 실행하여 코드를 핫스왑 할 수 있습니다.

직장에서는 클래스 파일의 타임 스탬프를 비교하여 코드 변경 사항을 자동으로 핫스왑하는 스크립트를 사용합니다. 이는 변경된 클래스 만 핫스왑하는 간단한 예제를 보여주는 프로젝트 페이지의 샘플과 유사합니다.

추가 참고 사항 : 이것은 JPDA를 사용합니다 .


약간 오래된 게시물이지만 누군가가 유용하다고 생각할 것입니다.

비교적 새로운 Hotswap Agent 가 문서화가 잘되어 있고 기능이 풍부 하다는 것을 알았습니다 (그리고 무엇보다도 오픈 소스 ).


JPDA (Java Platform Debugger Architecture) 인터페이스를 통해이 작업을 수행 할 수 있습니다. http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap

Erlang의 경우 자동이 아닙니다. JVM은 클래스 파일의 변경 사항에 대해 클래스 경로를 모니터링하지 않고 변경된 경우 다시로드하고 다시 연결합니다. 상당히 명백한 이유 때문입니다 (Java는 웹 배포를 위해 설계되었습니다. 변경을위한 http URL).


OSGi는 어떻습니까? 핫 스와핑은 사양에 "내장"되어 있습니다. 이것이 하나의 가능한 솔루션이라고 생각합니다.


You could use the Strategy design pattern, so you have a an object to manipulate rather than a method, and a protocol for communicating with the program to tell it to use a given class name as the class of the Strategy object.

ReferenceURL : https://stackoverflow.com/questions/4553353/change-a-method-at-runtime-via-a-hot-swap-mechanism

반응형