klasse dynamisch laden
-
hallo
ich habe ein programm erstellt wo ich eine klasse während der laufzeit dynamisch dazu lade.
wie kann ich nun überprüfen ob die klasse auch vom richtigen typ ist (roundingplicy.class)
mit instanceof kann man ja nur objekte vergleichen. ich möchte eine exception werfen falls eine falsche klasse geladen wird.
-
bis jetzt bekomme ich immer folgende fehlermelung wenn ich eine falsche klasse lade. möchte das ganze aber abfangen
Exception occurred during event dispatching:
java.lang.NoClassDefFoundError: arraysequence/Position
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
at java.lang.ClassLoader.defineClass(ClassLoader.java:426)
at converter.FileClassLoader.resolveThisClass(FileClassLoader.java:40)
at converter.FileClassLoader.loadClass(FileClassLoader.java:24)
at converter.LoadRoundingPolicy.Load(LoadRoundingPolicy.java:20)
at converter.Listeners.itemStateChanged(Listeners.java:47)
at java.awt.Choice.processItemEvent(Choice.java:516)
at java.awt.Choice.processEvent(Choice.java:488)
at java.awt.Component.dispatchEventImpl(Component.java:2593)
at java.awt.Component.dispatchEvent(Component.java:2497)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:339)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)
-
Das geht mit der Methode "isAssignableFrom" der Klasse "Class".
-
assignable = zuteilbar
ja das könnte noch hinhauen
-
hallo
wieso geht das nichtif(aClass.isAssignableFrom(RoundingPolicy))
RoundingPolicy ist eine abstrakte klasse
-
Original erstellt von <???????>:
**hallo
wieso geht das nichtif(aClass.isAssignableFrom(RoundingPolicy))
RoundingPolicy ist eine abstrakte klasse**
Wenn RoundingPolicy die Superklasse ist, dann geht der Aufruf andersherum. isAssignableFrom funktioniert so:
if (superClass.isAssignableFrom(subClass))
-
aber das problem ist das ich RoundingPolicy.isAssingnableFrom nicht aufrufen kann.
-
[java]
RoundingPolicy.class.isAssignableFrom[/code][ Dieser Beitrag wurde am 18.04.2003 um 11:48 Uhr von Gregor editiert. ]
-
bekomme folgende fehlermeldung
*** Rebuild started.
: cannot resolve symbol
symbol : method isAssingnableFrom (java.lang.Class)
location: class java.lang.Class
if(RoundingPolicy.class.isAssingnableFrom(aClass)){
^
1 error
*** Compiler reported errors
-
Hmmm... komisch! Ich sehe den Fehler nicht. Zeig mal etwas mehr Code. Welchen Java-Compiler nutzt du?
-
also hier wird die klasse geladen und falls der typ falsch ist möchte ich das er eine fehlermeldung ausgibt (z.b. messagebox oder so)
ich habe es jetzt so abgeändert das er mir eine classcastException wirft.
public static RoundingPolicy Load(File file){//throws Exception{ FileClassLoader mLoader; try{ mLoader = new FileClassLoader(file); Class aClass = mLoader.loadClass(file); //Hier würde ich gerne abfragen ob der Typ stimmt und falls nicht den default //Klasse zuweisen return (RoundingPolicy)aClass.newInstance(); }catch(IOException e){ System.err.println(e.toString()); }catch(ClassCastException e){ System.err.println(e.toString()); }catch(InstantiationException e){ System.err.println(e.toString()); }catch(IllegalAccessException e){ System.err.println(e.toString()); }catch(Exception e){ System.err.println(e.toString()); } return null; } }
hab mal noch ne andere frage und zwar
würde ich gerne auf diese exceptions reagieren d.h. wenn eine falsche klasse geladen wurde, dass er dann automatisch den Defaultwert wählt. Ist es angebracht diese zu weisung im catch abschnitt zu machen.
-
Hab den Fehler:
isAssingnableFrom
...da ist ein "n" zu viel drin!
-
Original erstellt von <hi>:
**
hab mal noch ne andere frage und zwar
würde ich gerne auf diese exceptions reagieren d.h. wenn eine falsche klasse geladen wurde, dass er dann automatisch den Defaultwert wählt. Ist es angebracht diese zu weisung im catch abschnitt zu machen.**Naja: Auf Exceptions reagierst du im catch-Block, oder vielleicht rufst du von da auch ne Methode auf, die auf die Exception reagiert.
Allerdings sind Exceptions kein Werkzeug, um den Fluss des Programms zu steuern. Es sind Ausnahmen. Man sollte sein Programm so programmieren, dass normalerweise garkeine Exceptions auftreten.
-
Original erstellt von Gregor:
**Hab den Fehler:isAssingnableFrom
...da ist ein "n" zu viel drin! :)**
BTW: Tipp:
Hol dir eine IDE wie Eclipse. Wenn Eclipse so einen Fehler findet, dann macht es selbstständig Vorschläge, wie der Fehler behoben werden kann. Da kann man dann mit einem Click ein Pop-Up-Menu mit möglichen Ausbesserungen öffnen. In diesem Fall hätte das Pop-Up-Menu nur einen Eintrag:
Change to 'isAssignableFrom(..)'
Das verringert die Zeit, die man durch solche Flüchtigkeitsfehler verliert, doch ganz erheblich!
[ Dieser Beitrag wurde am 18.04.2003 um 11:58 Uhr von Gregor editiert. ]
-
ja ich arbeite mit together. und dort ist es normalerweise so das wenn man ein punkt setzt automatisch eine auswahl kommt und das ist hier eben nicht der fall.
darum stimmt auch etwas anderes nicht
-
Allerdings sind Exceptions kein Werkzeug, um den Fluss des Programms zu steuern. Es sind Ausnahmen. Man sollte sein Programm so programmieren, dass normalerweise garkeine Exceptions auftreten.
aber wenn eine falsche klasse geladen wird dann muss man darauf reagieren und eine default wert laden
-
Original erstellt von <hi>:
**
darum stimmt auch etwas anderes nicht**Inwiefern? Gibt es immernoch ne Fehlermeldung, oder denkst du, dass etwas mit deiner IDE nicht stimmt?
-
hast recht jetzt klappts
aber kannst du mir mal erklären wieso man RoundingPolicy.class.* schreiben muss wieso noch das class dazwischen . ich hätte jetzt eher das ganze nach Class gecastet.
-
Original erstellt von <hi>:
**
aber kannst du mir mal erklären wieso man RoundingPolicy.class.* schreiben muss wieso noch das class dazwischen . ich hätte jetzt eher das ganze nach Class gecastet.**RoundingPolicy ist eine Klasse. Du brauchst aber keine Klasse, sondern ein Objekt der Klasse Class, welches die Klasse RoundingPolicy repräsentiert. Das liefert dir das ".class" zurück.
...und casten geht nicht, weil du nur bei Objekten casten kannst, RoundingPolicy ist aber eine Klasse.
...verwirrend!
-
hab jetzt das ganze mal mit dem jbuilder probiert. Dort zeigt er es mir an was ich auswählen kann. ja das mit dem class ist schon etwas verwirrend
wäre mir logischer wenn es irgend ein getclass wäre (aber ist halt kein objekt).
das mit dem casten hast du natürlich vollkommen recht. geht nur auf objekte