클래스 로더에서 클래스 바이트 코드 구현을 어떻게 든 다시로드 할 수 있습니까? 런타임에 클래스에 메서드를 추가하려고합니다.새 바이트 코드로 클래스를 다시로드 할 수 있습니까?
4
A
답변
2
아니요, 클래스를 모든 클래스 로더에서 다시로드 할 수 없습니다.
당신이 할 수있는 일은 클래스의 첫 번째 버전을로드 할 사용자 정의 클래스 로더를 작성하고 사용하는 것입니다. 클래스를 업데이트하려면 첫 번째 클래스의 모든 인스턴스, 클래스 <> 개체의 모든 인스턴스 및 첫 번째 버전을로드 한 클래스 로더를 삭제해야합니다. 이는 JVM에서 클래스를 언로드하는 유일한 방법입니다. GC가 모든 클래스 (클래스 <> 객체 및 클래스를로드 한 ClassLoader의 인스턴스)를 수집 할 때 언로드됩니다.
그런 다음 새 클래스 로더를 인스턴스화하고 클래스를로드합니다.
이것은 서블릿 컨테이너 (예 : Tomcat)가 응용 프로그램을 동적으로로드하고 언로드하는 것과 비슷합니다.
방금 메소드를 동적으로 추가하려고하는 경우 얼마 전에 사용한 것과 매우 비슷하지만 매우 유사한 접근 방식이 있습니다. 클래스 로더와 연관된 Java 컴파일러 API를 사용할 수 있습니다. 클래스의 "코드"를 클래스 로더에 전달하면 Java 컴파일러가 호출됩니다 (원하는 경우 디스크에 파일이 필요하지 않음). 클래스 로더를 사용하여 컴파일 된 바이트 코드를로드합니다. 어쨌든 이처럼로드 된 클래스를 언로드하려면 클래스 로더를 버려야한다.
관련 문제
- 1. QML 사전 컴파일을 바이트 코드로 할 수 있습니까?
- 2. R 패키지를 바이트 코드로 컴파일 할 수 있습니까?
- 3. 새 값으로 JGrid를 다시로드 할 수 없습니다.
- 4. CLR을 다시로드 할 수 있습니까?
- 5. go 바이너리가 스스로 다시로드 할 수 있습니까?
- 6. (Windows) 환경 변수를 다시로드 할 수 있습니까?
- 7. ASM 바이트 코드로 테스트
- 8. Java 바이트 코드로 클래스
- 9. 부호가있는 바이트 코드로 로딩
- 10. 소스를 바이트 코드로 변환하는 데 PHP APC를 사용할 수 있습니까?
- 11. Coco/R은 파싱 된 파일을 바이트 코드로 바꿀 수 있습니까?
- 12. JVM 바이트 코드로 메모리를 명시 적으로 비울 수 있습니까?
- 13. Django에서 템플릿을 다시로드 할 수 있습니까?
- 14. IRB에서 스크립트를 어떻게 다시로드 할 수 있습니까?
- 15. CodeIgniter의 session_id에서 세션을 다시로드 할 수 있습니까?
- 16. PHP에서 crontab을 다시로드 할 수 있습니까?
- 17. 어떻게 돛 콘솔을 다시로드 할 수 있습니까?
- 18. UserControl의 XAML 속성을 다시로드 할 수 있습니까?
- 19. 어떻게 sbt 다시로드 할 수 있습니까?
- 20. 모노 CSharpRepl에서 어셈블리를 다시로드 할 수 있습니까?
- 21. 클릭하면 div 하나만 다시로드 할 수 있습니까?
- 22. XAML 그림을 다시로드 할 수 있습니까?
- 23. Ruby에서 새 클래스를 초기화 (초기화) 할 수 있습니까?
- 24. t4 템플릿 내에 새 클래스를 정의 할 수 있습니까?
- 25. 파일의 클래스를 새 파일로 구현할 수 있습니까?
- 26. renderer3d를 새 데이터로 다시로드
- 27. 바이트 배열을 확장 할 수 있습니까?
- 28. R 코드를 바이트 코드로 변환
- 29. 바이트 코드로 컴파일하는 동기는 무엇입니까?
- 30. ELMAH를 코드로 완전히 구성 할 수 있습니까?
확실하지 않지만 도움이 될 수 있다고 생각합니다 .http : //stackoverflow.com/questions/6680674/can-a-java-class-add-a-method-to-itself-at-runtime – kaysush
[this can 도움을] (http://stackoverflow.com/questions/4016305/how-to-emit-and-execute-java-bytecode-at-runtime), 특히 허용 대답. 나는 [this] (http://asm.ow2.org/)로 뭔가를 할 생각이다. – Raufio