당신은 단지 당신이에 액세스 할 수 있습니다 알고 인터페이스를 통해 클래스 C
에 액세스해야하는 경우, 그것은 간단하다 :
MyInterface provider=null;
try{
Class myClass= Class.forName("sysPackage.C");
provider = (MyInterface)(myClass.newInstance());
}catch(Exception ex){
}
if(provide!=null){
//Use provider
}
C
에 사용할 수있는 인터페이스가 있다면 대신 대신 인터페이스의 구성원이 될 래퍼 클래스 S
을 만들 수 있습니다.
class S implements MyInterface{
static {
try {
Class.forName("sysPackage.C");
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static void forceExceptionIfUnavailable() {}
//TODO: Methods that use C. Class C will only be used within this class
}
S
는 C
를 사용할 수없는 경우 예외가 클래스 확인 중에 발생되도록 정적 블록을 가지고있다. 클래스를로드 한 직후에 forceExceptionIfUnavailable
을 호출하여 정적 블록이 즉시 실행되는지 확인합니다. 충돌이 발생하지 않으면 S
의 메서드를 사용하여 간접적으로 클래스 C
을 사용할 수 있습니다.
기본적으로, 공용 추상 클래스 A
패키지에 민간 구상 서브 클래스 S
으로, 새로운 패키지 P
를 만듭니다
또한, 우리는 방법 here를 사용할 수 있습니다. A
에는 인스턴스화 중에 예외가 throw 된 경우 의 인스턴스가 S
또는 null
인 정적 메서드가 있습니다. S
의 각 인스턴스는 C
의 인스턴스를 가지므로 C
을 사용할 수없는 경우 인스턴스화에 실패합니다. 그렇지 않으면 성공합니다. 이 방법은 S
(그리고 따라서 모든 C
API)이 조금 비싸기 때문에 패키지 전용입니다.