Java: Wie kann ich das überschreiben einer Methode von einer Klasse dynamisch (Klasse ist schließlich NICHT im classpath)?

Wie rufe ich eine Methode einer Klasse dynamisch + bedingt?
(Klasse ist schließlich nicht im classpath)

Sagen wir mal, ich muss die Klasse NimbusLookAndFeel, aber auf einigen Systemen ist es nicht verfügbar (D. H. OpenJDK-6).

Also ich muss in der Lage sein:

  • Um es kennen zu lernen, die Klasse ist verfügbar (zur Laufzeit),
  • Wenn es nicht der Fall ist, überspringen die ganze Sache.
  • Wie komme ich zu überschreiben einer Methode von einem dynamisch geladenen Klasse
    (so erstellen Sie eine anonyme innere sub-Klasse)?

Code-Beispiel

public static void setNimbusUI(final IMethod<UIDefaults> method)
    throws UnsupportedLookAndFeelException {

  //NimbusLookAndFeel may be now available
  UIManager.setLookAndFeel(new NimbusLookAndFeel() {

    @Override
    public UIDefaults getDefaults() {
      UIDefaults ret = super.getDefaults();
      method.perform(ret);
      return ret;
    }

  });
}

BEARBEITEN:
Nun bearbeitete ich meinen code, so wie es vorgeschlagen wurde, abzufangen NoClassDefFoundError mit try-catch. Es fehlschlägt. Ich weiß nicht, ob es OpenJDK ist Schuld. Ich bekomme InvocationTargetException, verursacht durch NoClassDefFoundError. Komisch, dass ich nicht fangen InvocationTargetException: Es ist geworfen sowieso.

EDIT2::
Ursache gefunden: ich war wrapping SwingUtilities.invokeAndWait(...) rund um die erprobte Methode, und das sehr invokeAndWait Anruf wirft NoClassDefFoundError beim laden Nimbus ausfällt.

EDIT3::
Kann jemand bitte klären, wo NoClassDefFoundError können bei allen auftreten? Denn es scheint, dass es immer auf die aufrufende Methode, nicht die tatsächliche Methode, die verwendet die nicht vorhandene Klasse.

NoClassDefFoundError tritt beim laden einer Klasse, die anwesend war in der compile-Zeit classpath, aber ist nicht in der runtime-classpath. ClassNotFoundException tritt beim laden einer Klasse, die ist nicht in der runtime-classpath, aber nicht müssen vorhanden sein, in compile-Zeit classpath.
@BalusC: Meine Frage in EDIT3 war mit EDIT2: Ist irgendwo angegeben, dass NoClassDefFoundError Auftritt, sagen wir mal, während der Konstruktion der Klasse, die versucht, rufen Sie eine andere nicht-vorhandenen Klasse, oder tritt es nur, wenn die - Methode, welche Anrufe die nicht vorhandene Klasse aufgerufen wird, ... Mehr Allgemeine: wo angegeben ist wenn eine bestimmte Klasse geladen wird?

InformationsquelleAutor java.is.for.desktop | 2010-08-07

Schreibe einen Kommentar