ladowanie odpowiedniej klasy w zaleznosci od wersji javy

0

hej, pisze aplikacje na komorke i mam pewien problem. przedstawie go w najprostszy sposob. Przyklad:

mamy 2 wesje javy, java_1 i java_2. java_2 jest nowsza i posiada pare klas wiecej. moja aplikacja na tel ma byc elastyczna i chce aby byla tylko jedna wersja, niewazne czy na telefonie jest java_1 czy java_2. Na poczatku aplikacji, programistycznie jestem w stanie wyciagnac jaka na telefonie jest wersja javy. i teraz w zaleznosci od tego czy jest java_1, chce aby ladowal klasa_1, a jesli jest java_2 aby ladowal klasa_2 gdzie wykorzystuje te pare funkcji ktorych nie ma w java_1. jak moge zrobic cos takiego?

mam nadz ze jasno opisalam moj problem.

  pzdr, 
   misty
0

Niestety, czegoś takiego nie da się zrobić, bo mimo, że nie masz zamiaru używać nowych klas w starej wersji Javy, to Twój telefon tego nie wie, więc nie może pozwolić na ich załadowanie. Wiem, że to niewygodne, ale w tej systuacji najlepiej by było przygotować dwa osobne programy.

0

na pewno sie nie da? wiesz kombinowalam z dyrektywami ale tak sie jednak nie da. kolega jednak stwierdzil ze dynamicznie ladujac klase moge to obejsc. tyle ze nie wiem za bardzo jak, tzn nie rozumiem..

wiesz moze na czym to polega? czytam co nieco, ale poki co nic mi sie nie rozjasnia..

pzdr,
misty

0

Pozwoliłem sobie wywalić głupoty...

Co do metody to w przypadku javy ME nie można tego zrobić. W Javie SE masz mechanizmy ResourceLoad i Reflection.
Teoretycznie można stworzyć fabrykę, która dostarczy odpowiednich funkcjonalności (dekorator) lub NullObject. Kod jest wtedy niby uniwersalny, ale nie mam pewności czy w JME da się robić sztuczki za pomocą Class.forName().

wieczorkiem przykład

0

ja wlasciwie pisze na blackberry-oni maja J2ME + troche swojego api. wiec moze tutaj by sie dalo. czekam wiec na przyklad, bo poki co nie rozumiem tego za bardzo.

dzieki,
misty

0

Zgodnie z obietnicą kod:

public class App {

	private static Class<?> a = null;
	private static I i;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// chcemy załadować i użyć A o ile istnieje
		try {
			a = Class.forName("eu.runelord.programmers.t142186.A");
		} catch (ClassNotFoundException e) {
			// A nie istnieje!
			a = null;
		}
		if (a != null) {
			// jak poleci błąd to znaczy, że spartoliliśmy coś naprawdę nieźle
			try {
				i = (I) a.newInstance();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		else{
			// nie ma A, ale jakoże mamy nasz NullObj to:
			i = new NullObj();
		}
		i.m();
	}

}

interface I {
	public void m();
}
/*
class A implements I {
	public void m() {
		System.out.println("A");
	}
}
*/
class NullObj implements I {
	public void m() {
		System.out.println("NULL Stub");
	}
}

Spróbuj odkomentować A.

Teraz kolejna ważna rzecz. Jeżeli masz jednak A to chciała byś, aby używane było oryginalne A, a nie twoje. Po pierwsze sprawdź czy klasa, którą chcesz zastąpić nie implementuje jakiegoś interfejsu. Jak tak to można dołączyć listę interfejsów do jara i się pobawić jak w przykładzie. Jeżeli nie to niestety bez różnych kompilacji się nie obejdzie.

0

Java ładuje klasy dynamicznie - przynajmniej tak to powinno się odbywać. Java nie spróbuje załadować klasy, której Twój kod ani razu nie użyje. Wystarczy więc, żeby Twoje klasy użytkowe były przygotowane w dwóch wersjach i najlepiej implementowały ten sam interfejs. Zależnie od instrukcji/wyrażenia warunkowego w której konsekwentnie sprawdzasz wersję javy do zmiennych reprezentujących obiekty z tym interfejsem przypisujesz odpowiednią klasę, np.:

interface Klasa
{
void jakaśMetoda();
//...
}
class A implements Klasa {...}
class B implements Klasa {...}
//...
Klasa x = czyJava2() ? new B() : new A();
//...
x.jakaśMetoda();

Formalnie sprowadza się to do tego samego co wywołanie dwóch różnych aplikacji w zależności od wykrycia javy 1 lub 2. Pozwala jednak nie powtarzać mnóstwa kodu - szczególnie jeżeli różnice w kodzie byłyby niewielkie.

0

Koziołek, Twoj kod sie skompilowal ale nie dzieje sie nic. zaden komunikat sie nie pojawia, niezaleznie od tego czy A jest zakomentowane czy nie. co to w ogole oznacza:
a = Class.forName("eu.runelord.programmers.t142186.A");

a dokladnie chodzi mi o srodek: eu.runelord.programmers.t142186.A ?

pzdr

0

oj blad mialam dlatego nic sie nie pojawialo, sorki. tak czy siak jedyne co sie pojawia to NULL Stub, niezaleznie od tego czy A jest zakomentowane czy nie.. no i ponawiam pytanie o to czym jest eu.runelord.programmers.t142186.A ?

pzdr

0

eu.runelord.programmers.t142186.A jest nazwa klasy napisanej przez @Koziołka i umieszczonej w pakiecie eu.runelord.programmers.t142186

0

aa, glupia jestem. ale to dlatego ze wlasnie nie za bardzo to rozumiem. to dodalam swoja klase:

public class A {

    public A(){

            System.out.println("jestesmy w A");
    }

}

i zmienilam na:
a = Class.forName("A");

no i teraz jak mam odkomentowane

class A implements I {
        public void m() {
                System.out.println("A");
        }
}

to dostaje:
A

zas jak ten kod zakomentuje to dostaje:
run:
jestesmy w A
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to I
at App.main(App.java:20)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

0

kurde, jak podepne ten kod do aplikacji na telefon i uzyje przez to innego kompilatora, to sie pluje, tzn z ta dodana klasa:

public class A {

public A(){

        System.out.println("jestesmy w A");
}

}

sie pluje. jak ja wywale to ciegle dostaje NULL Stub niezaleznie od wszystkiego. juz nic nie rozumiem:/

1 użytkowników online, w tym zalogowanych: 0, gości: 1