Java6 Methode in Java5 verwenden (memory leak JInternalFrame)

eskimo328

Aktives Mitglied
Wie kann man in einer Anwendung, die mit JDK5 kompiliert wird und unter JRE5 und JRE6 lauffähig ist, eine Methode verwenden, die es nur in JRE6 gibt?

Folgender Hintegrund:
Unsere Anwendung läuft bisher auf Notebooks auf denen JRE5 oder JRE6 installiert ist. Jetzt habe ich aber folgendes Problem bzgl. JInternalFrames festgestellt:

In Java 6 gibt es ein Problem mit der Freigabe von Speicher, da teilweise auf JInternalFrames auch nach dem Schließen noch referenziert wird. Das Problem ist bekannt: OTN Discussion Forums : JInternalFrame & Garbage Collection

Mit folgendem Code kann das Problem gelöst werden:
Java:
addInternalFrameListener(new InternalFrameAdapter() {
	public void internalFrameClosed(InternalFrameEvent e) {
		desktop.selectFrame(true);
	}
});

Das Problem kann also mit Aufruf der Methode
Code:
selectFrame(true);
behoben werden. Aber unter JRE5 gibt es die Methode gar nicht. Damit kann das Programm auch nicht unter 5 kompiliert werden. Gibt es eine Möglichkeit oder muss eine andere Lösung gefunden werden?
 
Zuletzt bearbeitet:
du kannst über Reflection rausfinden ob es diese Methode gibt und sie dann auch ggf. über Reflection aufrufen.
Das ist nicht sehr schön, manchmal in der Praxis aber eine einfache Lösung für solche Probleme.
 
Du hast recht, das ist eine einfache Lösung. Hab das eben ausprobiert. Scheint zu funktionieren.
Spricht etwas gegen diese Lösung oder gibt es noch "schönere" Lösungen?

Hier noch der entsprechende Code.

Java:
invokeMethod(desktopPane, "selectFrame", true);

//...

/**
 * @param obj the object the underlying method is invoked from 
 * @param methodName the method to call
 * @param args the arguments used for the method call
 */
public void invokeMethod(Object obj, String methodName, Object... args) {
	
	if(obj == null) {
		throw new IllegalArgumentException("obj must not be null!");
	}
	if(methodName == null) {
		throw new IllegalArgumentException("methodName must not be null!");
	}
	
       Method[] methods = obj.getClass().getDeclaredMethods();
       if(methods != null) {
       	for (Method method : methods) {
			if(method != null && methodName.equals(
					method.getName()) ) {
				method.setAccessible(true);
				try {
					method.invoke(obj, args);
				} catch (IllegalArgumentException e1) {
					e1.printStackTrace();
				} catch (IllegalAccessException e2) {
					e2.printStackTrace();
				} catch (InvocationTargetException e3) {
					e3.printStackTrace();
				}
				break;
			}
		}	
        }
}
 
Ein Umstieg auf Java 6 ist leider nicht so einfach möglich und auf die schnelle schon gar nicht. Ich denke die Lösung per Reflections muss es vorübergehend tun.
 

Neue Themen


Zurück
Oben