2010-02-05 3 views
3

큰 (많은 클래스) Java 프로젝트에서 작업 중이며 소스 코드가 있지만 대부분의 클래스는 ClassLoaders를 통해 동적으로 생성되거나 다운로드됩니다. 어쨌든, 나는 url을 열기위한 호출을 추적 할 수 있도록 java.net.URL 클래스를 "오버라이드 (override)"하고 싶습니다. 내용이 SSL로 암호화되어 있기 때문에 스니퍼를 사용할 수 없습니다. java.net.URL을 확장하려고 시도했지만 최종 클래스로 인해 작동하지 않았습니다. 또한 java.net.URL에 대한 소스를 열고 수정하여 성공적으로 빌드 할 수 있습니다. 이제 어떻게 기본 java 클래스 로더를 수정하여 원래의 java.net.URL 대신 내 수정 된 복사본을로드 할 수 있습니까? 모든 제안을 환영합니다! 미리 감사드립니다.Java 프로그램에서 java.net.URL 클래스를 통해 열린 URL을 모니터하는 방법은 무엇입니까?

답변

3

옵션으로 AspectJ을 사용하고 확장 코드를 확장하는 대신 URL 클래스에 넣을 수 있습니다. 그렇게하면 원본 소스를 수정할 필요가 없으며 최종 클래스를 "확장"할 수 있습니다. 단점은 프로젝트에 다른 의존성을 추가한다는 것입니다.

아직 AOP와 함께 일하지 않은 경우, 당신은 내 블로그에서 AOP에 대한 짧은 소개 찾을 수 있습니다 : http://whatiscomingtomyhead.wordpress.com/2010/02/06/aspect-oriented-programming-an-introduction/

+0

빠른 답변 주셔서 감사합니다. 그것은 stackoverflow.com을 사용하여 내 처음이야 (물론, 물어, 롤). 전에 AspectJ를 사용 해본 적이 없지만 완벽하게 들린다. 다른 의존성을 추가하는 데 문제가 없다. 어떻게 작동하는지 알기 위해 노력하고 있지만 구문을 실제로 이해할 수는 없습니다. 나는 이것을 찾았습니다 : Pointcut ("실행 (* new (..))") 함수 호출을 연결하는 것처럼 보입니다. 여전히 java.net.URL 생성자에 대한 호출을 인터셉트하는 방법을 모르겠습니다.처음 AspectJ 사용자를위한 코드를 제공해 주시겠습니까? 다시 한번 감사드립니다. –

+0

안녕하세요 Marcio, 나는 내 대답을 편집하고 AOP에 대한 간단한 소개 프레젠테이션을 찾을 수있는 블로그에 대한 링크를 추가했습니다 (또한 1 개의 코드 예와 함께!). AOP에 관해 웹에서 많은 자료를 찾을 수도 있습니다. 생성자 pointcuts는 다음과 같이 정의 할 수 있습니다. call (URL.new (..)) 이 문제가 도움이 되었기를 바랍니다. Nils에 감사드립니다! –

1

는 AspectJ의를 사용하여 생각이 있으? URL 생성자에 pointcut를 설정하여 새로운 URL 인스턴스 생성을 알릴 수 있습니다.

2

발견 한대로 URL을 확장 할 수 없습니다. 사용자 정의 버전의 클래스를로드하려면 JVM을 가져올 수 있지만 악몽처럼 들리는 IMHO를 가져올 수 있습니다.

다행히도 사용자 정의 URLStreamHandlerFactory을 구현하고 URL.setURLStreamHandlerFactory()로 등록 할 수 있습니다. 이렇게하면 URL이 원하는대로 열릴 때 랩하고 모니터 할 수 있습니다.

편집

그러나 앱이 이미 등록하는 경우이 방법을 사용할 수 없습니다; URLStreamHandlerFactories는 1/app입니다. 많은 유형의 앱 컨테이너는 하나 (예 : Tomcat)를 사용하므로 SOL 중 하나를 사용하는 경우

+0

또 다른 문제는 URLStreamHandlerFactory를 구현하는 것이 쉽지 않다는 것입니다. 다른 프로토콜에 적합한 핸들러 구현을 찾으려면 VM 특정 로직을 다시 구현해야하기 때문입니다. – jarnbjo

0

표준 API에서 클래스를 수정 한 경우 클래스 (jar 또는 디렉토리)를 부트 클래스 경로 앞에 추가해야합니다. 그렇지 않으면 VM 내부 클래스가 일반 클래스 경로에 추가 된 클래스보다 우선합니다. Sun의 VM을 사용하면 -Xbootclasspath/p : 인수를 사용하여 내부 구현보다 높은 우선 순위로 새 클래스를 추가 할 수 있습니다.

URL 구현을 수정하지 않고 다른 옵션으로 ProxySelector를 구현할 수 있습니다. URLConnection을 열면 (자), URL 구현은, 지정된 주소에 적절한 프록시의 ProxySelector.select (URI uri)에 문의를 실시합니다. 실제로 프록시를 사용하는 경우에도 작동합니다. 독자적인 구현을 등록하기 전에, ProxySelector.getDefault()를 사용해 ProxySelector 시스템을 취득 할 수 있습니다. 그리고, select 메소드에 건네진 URI를 추적 한 후, 선택 구현을 원래의 구현에 위양합니다.

+0

인수 -Xbootclasspath/p :는 트릭을해야하지만 다른 사람들이 제안한대로 AspectJ를 먼저 사용하려고 할 것이라고 생각합니다. 기본 구현 권한을 망칠 필요가 없습니까? 감사합니다. –

관련 문제