2013-02-25 1 views
4

클래스 로더에서 클래스 바이트 코드 구현을 어떻게 든 다시로드 할 수 있습니까? 런타임에 클래스에 메서드를 추가하려고합니다.새 바이트 코드로 클래스를 다시로드 할 수 있습니까?

+0

확실하지 않지만 도움이 될 수 있다고 생각합니다 .http : //stackoverflow.com/questions/6680674/can-a-java-class-add-a-method-to-itself-at-runtime – kaysush

+0

[this can 도움을] (http://stackoverflow.com/questions/4016305/how-to-emit-and-execute-java-bytecode-at-runtime), 특히 허용 대답. 나는 [this] (http://asm.ow2.org/)로 뭔가를 할 생각이다. – Raufio

답변

2

아니요, 클래스를 모든 클래스 로더에서 다시로드 할 수 없습니다.

당신이 할 수있는 일은 클래스의 첫 번째 버전을로드 할 사용자 정의 클래스 로더를 작성하고 사용하는 것입니다. 클래스를 업데이트하려면 첫 번째 클래스의 모든 인스턴스, 클래스 <> 개체의 모든 인스턴스 및 첫 번째 버전을로드 한 클래스 로더를 삭제해야합니다. 이는 JVM에서 클래스를 언로드하는 유일한 방법입니다. GC가 모든 클래스 (클래스 <> 객체 및 클래스를로드 한 ClassLoader의 인스턴스)를 수집 할 때 언로드됩니다.

그런 다음 새 클래스 로더를 인스턴스화하고 클래스를로드합니다.

이것은 서블릿 컨테이너 (예 : Tomcat)가 응용 프로그램을 동적으로로드하고 언로드하는 것과 비슷합니다.

방금 ​​메소드를 동적으로 추가하려고하는 경우 얼마 전에 사용한 것과 매우 비슷하지만 매우 유사한 접근 방식이 있습니다. 클래스 로더와 연관된 Java 컴파일러 API를 사용할 수 있습니다. 클래스의 "코드"를 클래스 로더에 전달하면 Java 컴파일러가 호출됩니다 (원하는 경우 디스크에 파일이 필요하지 않음). 클래스 로더를 사용하여 컴파일 된 바이트 코드를로드합니다. 어쨌든 이처럼로드 된 클래스를 언로드하려면 클래스 로더를 버려야한다.

관련 문제