2009-11-05 3 views
6

이미 다른 클래스 (바이트 배열로 사용 가능)에 의해 System 클래스 로더에 의해로드 된 Java 클래스 구현을 대체 (오버라이드) 할 수있는 방법이 있습니까? 두 번째 인쇄 "구현 2"로런타임시 Java 클래스의 구현 대체 (오버라이드)

public class Main { 
    public static void main(String ... args) { 
     Foo foo = new Foo(); 
     foo.print(); 

     ClassLoader cl = ... 

     Foo foo2 = (Foo) cl.newInstance(); 
     foo2.print(); 
    } 
} 

제 푸 인쇄 "실행 1"인쇄() 메소드 내 역시 설명하기

이 코드를 따른다. foo의 두 번째 인스턴스는 바이트 배열 (파일에 저장되거나 스트림에서 가져올 수있는 클래스)에서 클래스 로더에 의해 검색됩니다.

PS : Foo는 클래스가 아니라 인터페이스를 확장 할 수 없습니다. 즉, 클래스의 구현을 정의하는 실제의 바이트가 오버라이드 (override)됩니다.

+0

정말로 이것을하고 싶으십니까? 왜 그 질문을하는지 설명하는 것이 좋을 것입니다. –

답변

0

CGLib는 이와 같은 작업을 수행합니다. 이를 위해 Spring & Hibernate에서 사용된다.

0

계측 에이전트를 구현하고 java.lang.instrument.Instrumentation # redefineClasses (...)를 사용하여 이미로드 된 클래스의 바이트 코드를 바꿀 수 있습니다.

4

네, 문제 없습니다. java.net.URLClassLoader을 사용해야합니다. 예를 들어, URL을 넘겨주는 파일이있는 디렉토리 인 URL을 지정할 수 있습니다.

편집 : 그러면 원하는 전화 번호는 cl.loadClass("Foo").newInstance()입니다. 결과를 Foo으로 전송할 수는 없지만 리플렉션을 사용하여 print 메소드를 호출 할 수 있습니다. 또는 Foo를 print 메서드를 정의하는 다시 구현하지 않을 무언가의 하위 클래스 (또는 인터페이스 구현)로 만들고 캐스트합니다.

0

JMX를 사용하여 배포 해제 및 재배포 클래스를 사용합니다.

관련 문제