Java: использование стороннего класса, соответствующего моему интерфейсу - PullRequest
1 голос
/ 11 апреля 2009

Могу ли я взять иностранный класс в Java, который соответствует одному из моих пользовательских интерфейсы и "привести" его к этому интерфейсу?

Пример:

public class YouCanNotChangeMe_IAmNotYours{
    public void doSomethingSpecial();
}

public interface MyInterface{
    void doSomethingSpecial();
}

Могу ли я использовать этот иностранный класс в местах, где ожидается мой интерфейс?

Зачем мне это вообще нужно?

Я хочу динамически перезагружать новые версии JAR во время выполнения, как я уже упоминал здесь .

Теперь сервер знает все интерфейсы (зная прежнюю версию JAR во время компиляции). Проблема в том, что после загрузки классов из более новые версии этого JAR во время выполнения, эти «новые» классы действуют как если они не «знают» известный во время компиляции интерфейс.

Пример: старый класс с именем HelloClass (известный во время компиляции) реализует интерфейс HelloInterface , но недавно загруженный класс HelloClass не не реализует тот же интерфейс!

Ответы [ 2 ]

1 голос
/ 11 апреля 2009

Вы можете расширить внешний класс (при условии, что он не является окончательным) и заставить этот класс реализовать интерфейс.

В качестве альтернативы вы можете реализовать собственную оболочку для этого интерфейса:

public class ForeignClassWrapper implements MyInterface {
  private final YouCanNotChangeMe_IAmNotYours delegate;

  public ForeignClassWrapper(YouCanNotChangeMe_IAmNotYours delegate) {
    this.delegate = delegate;
  }

  public void doSomethingSpecial() {
    delegate.doSomethingSpecial();
  }
}

В целом, вы можете получить тот же эффект, используя отражение (чтобы вам не нужно было жестко кодировать YouCanNotChangeMe_IAmNotYours в вашем классе-обёртке).

0 голосов
/ 11 апреля 2009

Если я не ошибаюсь, похоже, вам нужно переосмыслить свой контейнер и дизайн ClassLoader. Вы пытаетесь достичь той же функциональности, которую поддерживает ваш средний контейнер сервлетов, поэтому, возможно, вам стоит подумать об этом для вдохновения.

Что касается конкретной проблемы: экземпляр x типа A является только экземпляром класса A , если x.getClass (). GetClassLoader () == A.class.getClassLoader () . Таким образом, даже если два или более объектов могут относиться к классу A , Java обрабатывает их как разные типы, если они имеют разные ClassLoaders.

Похоже, что интерфейс, который вы пытаетесь привести, должен быть в общей базе (или системе) ClassLoader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...