2013-11-01 2 views
0

내가이 개 수업을 말 개에서 어떤 makeSound()을 변경하기 위해 리플렉션을 사용할 수있는 방법은 이러한 분류를 수정하지 않고 가능합니다. 에스? 예를 들어 (이것은 단지 제안 일뿐입니다. 나는 반성을 가장 잘 이해하지 못합니다) Animal을 확장하는 Dog 클래스를 만든 다음 런타임에 Dog.java을 내가 작성한 클래스와 교환합니다. new Dog() 위에 쓰여진 것 대신에 나의 새 인스턴스를 생성합니다. Dog의 새 인스턴스가 만들어 질 때를 알 필요가 없도록하기 위해이 메소드가 필요하지만 "Woof"를 출력하는 대신 수정 된 makeSound()으로 만든 클래스를 사용하고 있습니다.런타임에 클래스의 모든 인스턴스에 대한 방법을 변경

더 나은 예를 들어 실험을 위해 서버 자체의 소스 코드를 수정하지 않고 Minecraft 서버를 수정하려고합니다. 내 코드를 CraftBukkit을 통해 JVM에로드하고 엔티티 클래스의 메소드를 수정 한 다음 엔티티가 서버로로드 됨으로써 엔티티의 동작 방식을 직접 변경하려고합니다. 이것이 반영을 통해 가능하다는 것을 압니다. 나는 전체 클래스를 수정 된 버전으로 런타임에 "스왑"할 수 있는지 궁금합니다.

+0

전략 패턴에 관심이있는 것 같습니다. http://en.wikipedia.org/wiki/Strategy_pattern 공장 패턴을 사용할 수 있습니다. 당신의 설명은 매우 불분명하며, 어떤 해결책을 설명하기보다는 어떤 상황에 도달하고 싶은지 설명하십시오. –

+1

AOP 및 Java Agent와 같은 기능을 제공하지만 리플렉션이나 복잡한 (복잡한) 개념없이 실제 요구 사항을 충족시킬 수는 있습니다. 당신이 만족시키고 자하는 진정한 시나리오에 대해 이야기 해 주시겠습니까? 그리고 우리는 직접적인 접근 방식을 찾는데 도움이 될 수 있습니까? –

+0

@ MarkElliot 내가 성취하려는 것을 보여주는 예를 들어 업데이트했습니다. 이제 내가 깨달은 지금, 복잡한 예제를 제공함으로써 간단한 질문을 던지려고 할 때마다 – user2249516

답변

3

아니요 런타임에 리플렉션을 사용하여 메소드를 변경할 수 없습니다. 리플렉션은 메소드, 액세스 필드 등을 호출하는 데 사용될 수 있습니다. 기본적으로 소스를 바이트 코드로 다시 컴파일하는 것을 의미하는 런타임시 Java 클래스를 변경할 수있는 기술은 없습니다.

+0

사용할 수있는 다양한 디버거 기능이 있지만 클래스를 즉시 다시 컴파일하거나 호출을 가로 채고 클래스 변경을 시뮬레이션하는 과정이 필요합니다. –

관련 문제