2011-10-05 3 views
0

내 프로젝트를 사용하는 별도의 프로젝트에서 외부 클래스에서 구현해야하는 클래스의 추상 메소드가 있습니다.(Java) 리플렉션을 통해 생성 된 새 객체에 대한 메소드를 생성 하시겠습니까?

- instanceof를 모든 클래스가 처음에 반사하여 생성된다 - 어쨌든

를, 클래스 A는 추상적이라고하고, (비 추상) 클래스 B는

B를 확장하는 모든 구현되지 않은 메소드가 B가 내 작업 공간에 있기 때문에 클래스 A에 있습니다. 따라서이 메소드를 추가하는 것이 좋습니다.

C도 A를 확장하지만 C는 A에서 추상 메서드의 하위 집합 만 갖습니다. 그러나 C는 내 작업 영역에 없습니다.

public <corresponding return type> <missingMethodName>() { return null; } 

이 가능

(각 방법의 경우) :

따라서, NOT A에서 C의 각 추상 메소드, 난과 같이 A의 방법을 추가 할 수있는 방법을 찾을 필요 ?

P. 내가 제어 할 수없는 객체와 동기화되도록 코드를 완전히 다시 작성해야하거나 위에서 언급 한 것과 같은 솔루션을 구현해야한다고 가정하십시오.

+0

은'A'는'A' 추상적이고,'C'는 모든 추상 메소드를 구현하지 않습니다? 또한,'super. ()'호출은 어떻게 호출되는'super'가'A'인지, 구현이 없는지 어떻게 작동할까요? –

+0

질문이 명확하지 않습니다. Reflection을 사용하면 클래스를로드하고 메소드를 호출 할 수 있습니다. 그러나 새로운 방법을 정의 할 수는 없습니다. 이를 수행하려면 바이트 코드 계측이 필요합니다. 또한, 어떤 작업 영역이이 작업과 관련이 있는지 알지 못합니다. 작업 영역은 IDE 작업입니다. Java 프로그램 실행과는 아무런 관련이 없습니다. –

+0

젠장, 네가 맞아, 불가능 해. 클래스는 런타임 전에이를 구현해야합니다. 젠체하는 ... – Ryan

답변

0

아니요, 내가 잘못 읽은 경우가 아니라면, 당신이 요구하는 것은별로 의미가 없습니다. 당신이 그 방법을 구현하지 않는를 확장하는 방법 C에

public <corresponding return type> <missingMethodName>() { super.<missingMethodName>(); } 

을, 주입하고 싶었다면

, 정확히 무엇을 할 것인가?

A에서 기본 구현을 제공하려면 괜찮습니다. C에 영향을 미치지 않습니다. A에 추상 메소드를 추가하면 C가이를 구현해야하며 자체를 추상으로 표시해야합니다. 그렇지 않으면 컴파일되지 않습니다. 이전의 A로 컴파일 된 C로 실행하는 경우 직렬화 또는 약간의 오류가 발생합니다.

+0

클래스의 프로젝트 디자인과 자동 학습이 어떻게 작동하는지는별로 좋지 않기 때문에별로 의미가 없다. Nicholas는 이미 클래스 C에 실제로 구현되지 않은 메서드가 없으면 컴파일 할 수 없다는 것을 분명히했습니다. – Ryan

0

super 구현이있는 인스턴스 메서드는 하위 클래스에서 호출 할 수 있으므로 절대 수행하면 안됩니다 예.

바이트 코드를 사용하여 이러한 메서드를 추가 할 수 있지만 getDefinedMethods()의 목록을 변경하는 것만 다를뿐입니다. 그러나 클래스의 객체의 동작은 변경되지 않습니다.

+0

분명히하기 위해서, 이것은 틀린 것입니다 : - A의 모든 서브 클래스 A에 각각의 추상 메소드가 있습니다. 실제로 모든 서브 클래스는 모든 메소드를 사용합니다. - Autograder 객체는 내 디자인과 일치하지 않는 방식으로 사물을 테스트하기 때문에 A에서 모든 추상 메소드를 사용하지 않습니다. (이것은 제공된 프레임 워크에 의존하는 학생들의 디자인을 만들기위한 그들의 잘못입니다.) – Ryan

+0

추상 클래스의 추상 메소드를 스텁 아웃하려면 바이트 코드를 사용하여 하위 클래스를 생성 할 수 있습니다. 예 : ASM. 그러나 자신의 글쓰기가 더 쉽습니다. –

0

조용한 어렵지만 당신이 Javassist

와 Javassist (자바 프로그래밍 보조)와 함께 할 수있는 응용 프로그램의 자바 바이트 코드를 조작 할 수있는 수단을 제공하는 자바 라이브러리입니다. 1 이러한 의미에서 Javassist는 구조적 반영, 즉 런타임에 클래스의 구현을 변경하는 기능을 지원합니다. 바이트 코드 조작은 제공된 클래스 로더를 통해로드 타임에 수행됩니다. 코드가`C`를 확장하는 경우 컴파일 않는 방법 http://en.wikipedia.org/wiki/Javassist