Das praktische Problem wurde anscheinend gelöst (siehe Mark Peters' y von jjnguy Antworten). Und die fireActionPerformed
Methode wurde ebenfalls bereits erwähnt (siehe OscarRyz' Antwort ), um mögliche Gleichzeitigkeitsprobleme zu vermeiden.
Was ich noch hinzufügen wollte, ist, dass Sie puede alle privaten und geschützten Methoden aufrufen (einschließlich fireActionPerformed
), ohne dass eine Unterklasse gebildet werden muss, unter Verwendung von Reflection. Zunächst erhalten Sie die Reflexion Method
Objekt einer privaten oder geschützten Methode mit method = clazz.getDeclaredMethod()
( clazz
muss die Class
Objekt der Klasse, die die Methode deklariert, und nicht eine ihrer Unterklassen (d. h. AbstractButton.class
für die Methode fireActionPerformed
, no JButton.class
)). Dann rufen Sie method.setAccessible(true)
zur Unterdrückung der IllegalAccessException
s, die sonst beim Versuch, auf private oder geschützte Methoden/Felder zuzugreifen, auftreten würden. Schließlich rufen Sie method.invoke()
.
Ich weiß jedoch nicht genug über Reflexion, um die Nachteile der Verwendung von Reflexion aufzählen zu können. Es gibt sie jedoch, und zwar laut der Reflection-API-Pfad (siehe Abschnitt "Nachteile der Reflexion").
Hier ein funktionierender Code:
// ButtonFireAction.java
import javax.swing.AbstractButton;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
public class ButtonFireAction
{
public static void main(String[] args) throws ReflectiveOperationException
{
JButton button = new JButton("action command");
Class<AbstractButton> abstractClass = AbstractButton.class;
Method fireMethod;
// signature: public ActionEvent(Object source, int id, String command)
ActionEvent myActionEvent = new ActionEvent(button,
ActionEvent.ACTION_PERFORMED,
button.getActionCommand());
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
}
});
// get the Method object of protected method fireActionPerformed
fireMethod = abstractClass.getDeclaredMethod("fireActionPerformed",
ActionEvent.class);
// set accessible, so that no IllegalAccessException is thrown when
// calling invoke()
fireMethod.setAccessible(true);
// signature: invoke(Object obj, Object... args)
fireMethod.invoke(button,myActionEvent);
}
}