2014-02-21 2 views
0

확장하지 않고 API에서 사용되는 클래스의 메서드를 재정의하려고합니다. 소스 코드를 다시 컴파일하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 클래스를 확장 할 수 없습니다. 인스턴스가 다른 클래스 내부에서 만들어지기 때문에 클래스를 확장 할 필요가있는 다른 클래스가 있기 때문입니다.확장하지 않고 메서드 재정의 (Java)

예 :

import A,B,C; 

    public class Tester{ 
    public static void main(String[] args){ 

    A a = new A(); 
    a.getB().method(); 
    //The object I want to handle is A 
    //A has-a B and C 
    //C extends B and is used at some point inside B 
    //how can I override method() in B? 
     } 
    } 

^나는

당신이 특정 문제를보고 싶을 경우

을 필요로하는 모든, 내가 HtmlUnit과 API를 사용하고 내가 노력하고있어이 문제를 주소 지정 DomNode에서 onAllChildrenAddedToPage() 메서드를 재정의합니다. DomNode는 WebClient 클래스에서 사용되며 WebClient 및 DomNode의 어느 지점에서 HtmlElement로 형변환해야합니다. 나는 DomNode2 (DomNode를 확장)를 WebClient에서 가져온 후에 만들고 있지만 DomNode2를 HtmlElement로 형변환 할 수 없으므로 ClassCastException을 발생시킵니다.

+0

DomNode를 확장하고 onAllChildrenAddedToPage()를 재정 의하여 ClassCastException이 발생하는 이유는 알 수 없습니다. 그러나 htmlunit API를 보면 HtmlElement가 DomNode를 확장합니다. 따라서 DomNode2는 HtmlElement를 확장하고 onAllChildrenAddedToPage()를 재정의 할 수 있습니다. 누군가가 HtmlElement에 개체를 캐스팅하려고하기 때문에 ClassCastException 문제가 해결됩니다. – anonymous

+0

방금 ​​HtmlParagraph를 확장 해 보았습니다 (HtmlElement가 나에게 오류를 주었고, 나쁘다). 그리고 어떤 이유로 든 ClassCastException 오류가 발생했습니다. 나는 DomNode2에게 super라고 불리는 생성자를 주었고 같은 패키지에 넣어 주었다. 정말 이상합니다. 스레드 "main"의 예외 java.lang.ClassCastException : com.gargoylesoftware.htmlunit.html.HtmlParagraph를 com.gargoylesoftware.htmlunit.html.DomNode2로 전송할 수 없음 – user3335154

+0

더 큰 그림을 얻기 위해 무엇을 시도 할 수 있습니까? ? 어쩌면 코드 일부를 게시 할 수도 있습니다. – anonymous

답변

0

소스 코드를 다시 컴파일하지 않으면 쉽게이 작업을 수행 할 수 없습니다. 당신이하려는 일이 반드시 필요하다는 것을 절대 확신합니까? 그렇다면 HtmlUnit은 오픈 소스이므로 사용자 정의 메서드로 소스를 다시 컴파일하는 것을 고려하십시오.

정말로 다시 컴파일하지 않으려면 ASM을 사용하여 클래스의 바이트 코드를 편집 해보십시오. 이것은 상당히 어렵지만 실제로 좋은 습관은 아닙니다.

코드를 메소드에 추가하기 만하면 메소드가 호출 될 때 메소드 인터셉터를 사용하여 코드를 실행할 수 있습니다. 이를 수행하는 방법에 대한 자세한 내용은 this question on method interceptors을 확인하십시오.

+0

그래, 내가 뭘 원한다면 재귀 적으로 DomNode 내부에서 호출되고 재귀가 원하는 것부터 바뀌기 때문에 (부모 노드가 자식 노드를 호출하여 자식 노드가 먼저 처리되도록하기 때문에) 메서드를 재정의해야한다. ASM은 너무 어려워 보입니다. 나는 인터셉터를 시도하고 작동하지 않는다면 소스 코드를 편집 할 것입니다. 감사. 다른 사람이 다른 해결책을 가지고 있지만, 나는 그것을 듣고 싶습니다. :) – user3335154