2016-09-14 10 views
2

번들 A :OSGi 클래스 로딩 : BND가 직접 참조되지 않는 클래스를 가져 오는 이유는 무엇입니까?

FooA.java

package com.foo.a; 

import com.foo.b.FooB; 

class FooA { 
    FooB b = new FooB(); 
} 

일괄 B :

FooB.java :

package com.foo.b; 

import com.foo.c.FooC; 

class FooB { 

    public FooC foo() { 
     ... 
    } 
} 

번들 C : ...

간단히 말해서, 나는 3 묶음 - A, B 및 C가 있습니다.

번들 A는 번들 B를 직접 참조하고 번들 B는 C를 참조합니다. 알다시피 FooA는 FooC에서 FooC를 반환하는 메서드를 사용하지 않으므로 FooC는 번들 A에서 직접 참조되지 않습니다.

OSGi 가져 오기 패키지를 포함하는 BND가 com.foo.c에 포함 된 이유는 무엇입니까? 내가 이해하는 방식 - 번들 A는 스스로를 해결할 수 있도록 번들 B 만 있으면됩니다. 번들 B는 다른 한편으로는 C가 필요합니다. 그러나 A가 거기에 사용되지 않는다면 A는 왜 C를 직접 요구해야합니까?

답변

2

필자는 사용하는 클래스에 대해 외부에서 볼 수있는 모든 클래스를 가져옵니다. FooB 클래스를 사용할 때 매개 변수로 필요하거나 결과로 반환 할 수있는 모든 클래스에 대한 액세스가 필요할 수 있습니다.

종속성을 피하려면 필요한 메서드 만 표시하는 인터페이스를 만들면됩니다. 그런 다음 번들 B의 해당 인터페이스로 서비스를 만들고 번들 A의 인터페이스를 사용하여 서비스에 액세스 할 수 있습니다.

+0

오케이, 인터페이스를 소개하는 것으로 이해합니다. 그러나 나는이 특별한 문제에 대한 해결책을 찾고 있지 않다. 제가하려는 것은 문제에 대한 이해를 얻는 것입니다 - 왜 BND에이 패키지가 포함되어 있습니까? 패키지가 정말로 필요합니까? 가져 오기를 수동으로 삭제하면 클래스로드가 중단됩니까? 왜? A는 C를 직접 사용하지 않습니다 ... – mdzh

+0

클래스 A를 인스턴스화하거나 자신의 케이스에서 사용하려면 Java가 C를 필요로하는지에 따라 달라집니다. 가져 오기를 제거하면 어떤 일이 발생하는지 보는 것은 흥미로울 것입니다. 그것은 여전히 ​​작동한다면 어쩌면 향상시킬 수 있지만 일반적으로 꽤 정확합니다 .. 아직도 인터페이스와 서비스를 사용하려고 노력해야합니다 ... 그것은 모듈을 실제로 분리 할 수있는 유일한 방법입니다. –

2

FooA 클래스의 바이트 코드를 살펴보십시오. 어떻게 든 FooC가 표시됩니다. Java Decompiler 도구를 사용하여 왜 사용되는지보십시오. 일부 디 컴파일러는 원래 Java 코드보다 약간 더 많은 정보를 표시하는 코드를 만듭니다. 나는 왜 여기를 참조하지만, 여기에 또 다른 예입니다하지 않습니다

public class ListProvider { 

    public static ArrayList getMyList() { return null; } 

} 

그리고 다른 클래스는이처럼 호출 :

List myVar = ListProvider.getMyList(); 

당신은 볼 수

는 다음과 같은 기능을 가지고 추측 다른 클래스의 바이트 코드에있는 ArrayList 그 이유는 바이트 코드 leven에 사용되는 함수 시그니처에도 반환 유형이 포함되어 있기 때문입니다.