Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > компиляция кода для 1.4 в 1.3


Автор: anonymouse 6.8.2007, 09:36
Код

 A a=new A(
   public void methodA() {
     System.out.println("success");
   }
 )

B b=new B();
b.setA(a);

А это абстрактный класс или интерфейс.
Проблема состоит в том что эта часть кода должна компилироваться в Java 1.3,1.4,1.5, но классы A и B в версии 1.3 не существуют.
Как мне это реализовать. С помощью рефлекшион не получается из-за абстрактного класса.
Заранее благодарен

Автор: batigoal 6.8.2007, 10:41
Цитата(anonymouse @  6.8.2007,  10:36 Найти цитируемый пост)
Проблема состоит в том что эта часть кода должна компилироваться в Java 1.3,1.4,1.5, но классы A и B в версии 1.3 не существуют.

Самый правильный вариант - писать под 1.3 и использовать только то, что есть в нем.

Автор: anonymouse 6.8.2007, 10:47
Это большой проект работающий стандартно 1.4. Но есть старые машины на платформе IBM. Там может быть только 1.3. Этот кусок будет использоваться только как фича, т.е. на 1.3 он работать не будет. Но важно чтобы он компилировался. Обычно эту проблему решают с помощью рефлекшиона Class.forName(...), но в данном случае, используется абстрактный класс. Неужели в модели Java-рефлекшн, ничего подобного не было реализовано ?

Автор: batigoal 6.8.2007, 12:58
Вообще, у нас в коде индусы где-то создавали экземпляр абстрактного класса, сейчас покопаюсь...

Добавлено через 4 минуты и 44 секунды
Не могу найти...

Автор: anonymouse 6.8.2007, 13:14
Цитата(batigoal @  6.8.2007,  12:58 Найти цитируемый пост)
Вообще, у нас в коде индусы где-то создавали экземпляр абстрактного класса, сейчас покопаюсь...

Ну спасибо, ты считаешь что такой фигней только индусы занимаються  smile 

Судя по всему через рефлекшион этого сделать никак нельзя. Придеться фейк класс писать.

Автор: AlexeyVorotnikov 6.8.2007, 14:42
Абстрактный класс на то он и абстрактный, что создать его экземпляр невозможно даже теоретически.

Уточните всё-таки постановку задачи.

Автор: batigoal 6.8.2007, 16:44
AlexeyVorotnikov, через рефлекшн - можно было, по крайней мере, до 4-й Явы. Видел.

Автор: LSD 10.8.2007, 00:26
Цитата(batigoal @  6.8.2007,  17:44 Найти цитируемый пост)
через рефлекшн - можно было, по крайней мере, до 4-й Явы. Видел.

Посмотрел JavaDoc по JDK 1.1, и там написано:
Цитата
Throws:
  • ...
  • InstantiationException - if the class that declares the underlying constructor represents an abstract class
  • ...

Ты уверен, что они создавали именно абстрактный класс?

Автор: batigoal 10.8.2007, 08:36
Цитата(LSD @  10.8.2007,  01:26 Найти цитируемый пост)
Ты уверен, что они создавали именно абстрактный класс? 

Да. Когда мы этот фрагмент увидели, у меня волосы дыбом встали, такое не забывается smile

Возможно, инстанцированию предшестовали некие махинации с абстракными методами, не знаю.

Автор: math64 10.8.2007, 09:48
Этот кусок кода и все другие которые работают под 1.4 выносишь и компилируешь под 1.4
Остальное компилируешь через 1.3 а для вызова кода 1.4 используешь Class.forName(). Возможно потребуются вспомогательные интерфейсы или абстратктые классы.
Код

public interface JDKInterface {
  void someMethod();
}

Код

public class JDK14Adapter implements JDKInterface {
  void someMethod() {
     <код для 1.4>
  }
}

Код

public class JDK13Adapter implements JDKInterface {
  void someMethod() {
     <замена кода для 1.3>
  }
}

Код

   JDKInterface adapter;

   if (<используется JDK1.3>)
      adapter = new JDK13Adapter();
   else
     adapter = (JDKInterface)Class.forName("JDK14Adapter").newInstance();
   adapter.someMethod();

В итоге получатся 2 jar'а: один для 1.3, другой - расширения для 1.4 При использовании 1.4 второй jar включить в classpath или слить два jar в один.

Автор: AlexeyVorotnikov 10.8.2007, 10:00
Цитата(batigoal @ 10.8.2007,  09:36)
Цитата(LSD @  10.8.2007,  01:26 Найти цитируемый пост)
Ты уверен, что они создавали именно абстрактный класс? 

Да. Когда мы этот фрагмент увидели, у меня волосы дыбом встали, такое не забывается smile

Возможно, инстанцированию предшестовали некие махинации с абстракными методами, не знаю.

Всё равно не могу себе представить как это может быть сделано.
Где-то здесь что-то не так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)