2012-06-18 3 views
0

Java API만큼이나, 나는 작업중인 프로젝트의 기본 API 패키지 (예 : java.util.Scanner)의 일부 클래스 코드를 변경해야합니다.자바 플랫폼 패키지 (내장 API) 소스 코드를 편집하는 방법은 무엇입니까?

이상적으로 내가 관심있는 클래스를 확장하고 내 자신의 하위 클래스를 만들지 만 확장 할 클래스는 '최종'으로 선언됩니다. 내가 어떻게하면 좋을지 어떻게 생각해? 이러한 패키지의 소스 코드를 사용자 정의하면 컴파일러에서 문제가 발생합니까?

+1

수업에서 무엇을 변경 하시겠습니까? 나는 API 코드를 변경하는 것이 필요하다는 것을 의심한다 ... – brimborium

+1

모든면에서, 왜 이것을해야합니까? 대부분의 경우 누군가가 그러한 요청을 내놓을 때 더 간단하고 직선적 인 해결책이 있기 때문에 묻습니다. – bpgergo

+0

@brimborium 생성자를 수정하는 것, 컨트롤의 흐름을 모니터하기 위해 void 메소드의 리턴 타입을 추가하는 것, 클래스에 내 자신의 메소드를 추가하는 것 등 다양한 일들이있다. – jesterII

답변

4

가능한 경우 다른 답변에서 제안하는 것처럼 포장하고 위임해야합니다. Adapter Pattern을 참조하십시오.

이 필요하면 물론이 방법을 사용할 수 있습니다.

간단한 방법은 다운로드 한 소스의 코드를 수정하고 클래스 패스에있는 jar 버전을 대체하는 것입니다.

또 다른 옵션은 가로형 프로그래밍 기법을 사용하는 것입니다 (AspectJ). 필요에 따라 호출을 가로 채고 수정할 수 있습니다.

리플렉션 및 자체 제작 클래스 로더를 사용하여 솔루션을 해킹하는 것도 가능하지만 코드 작성은 힘들 수 있습니다.

그러나 모두 당신이하고있는 것을 모르는 경우 매우 위험합니다. 종종 수업은 정당한 이유로 최종 결정됩니다.

귀하가 변경하고자하는 바를 구체적으로 알려 주시면, 귀하가 현재 필요하다고 생각하는 것을 피하는 데 도움을 줄 수 있습니다.

+0

고마워,이게 내가 찾고 있던거야. AspectJ에 대해 더 자세히 살펴볼 것이다. 그럼에도 불구하고 API를 변경하는 것보다 더 나은 방법을 얻을 수는 있습니다.하지만 그럼에도 불구하고이를 시도하는 데 관심이 있습니다. – jesterII

-1

하지 마십시오. 원래 스캐너를 감싸는 코드를 작성하여 사용하십시오. 내부 패키지를 업데이트하려면 런타임에 제공 할 수있는 endorsed 디렉토리 속성이 있습니다. 당신이 정말로 캔트 최종 클래스를 확장

1

..

u는 정말 클래스 SRC를 수정하여 그것을 할 수있는 클래스를 확장하여 기능을 추가하려는 경우. JDK에서 가져 와서 자신의 클래스로 저장하고 사용하십시오.

+0

이것은 유일한 것입니다 그 질문에 적용되는 대답, 나머지는 주로 그것을하지 않는 것에 대해 설교하고 있습니다. –

+0

@BaileyS - 내 대답을 downvoting하기 전에 읽었습니까?나는 그것을하지 말라고 설교했지만, 실제로 필요한 경우 (이 것을 포함하여) 시도 할 수있는 몇 가지 옵션을 주었다. –

+0

@Don Roby, 맞습니다. 질문을 편집하면 +1을 내 표로 바꿀 것입니다 :) –

-1

절대로 사용하지 마세요. 핵심 수업을 변경하지 마십시오. 클래스가 final 인 경우 - 상속이 아닌 composition을 사용하십시오.

관련 문제