import java.awt.event.*; import java.lang.reflect.*; import java.awt.*; // Tätä käytetään vain testausosassa. public class UniversalActionListener implements ActionListener { protected Object target; protected Object arg; protected Method m; public UniversalActionListener(Object target, String methodname, Object arg) throws NoSuchMethodException, SecurityException { this.target = target; // Laitetaan kohdeolio talteen. this.arg = arg; // Ja myös metodin argumentti. // Etsitään ja laitetaan talteen Method-olio, // jota kutsutaan kohdeolion kautta. Class c, parameters[]; c = target.getClass(); // Class-olio. if (arg == null) parameters = new Class[0]; // Metodin argumentti. else parameters = new Class[] { arg.getClass() }; m = c.getMethod(methodname, parameters); // Etsitään haluttu } // metodi. public void actionPerformed(ActionEvent event) { Object[] arguments; // Alustetaan argumentit if (arg == null) arguments = new Object[0]; else arguments = new Object[] { arg }; // Ja kutsutaan metodia. try { m.invoke(target, arguments); } catch (IllegalAccessException e) { // Tätä ei pitäisi koskaan tapahtua. System.err.println("UniversalActionListener: " + e); // Poikkeusta ei pitäisi tapahtua koskaan. } catch (InvocationTargetException e) { System.err.println("UniversalActionListener: " + e); } } // Yksinkertainen testiohjelma UniversalActionListener-luokkaa varten. public static void main(String[] args) throws NoSuchMethodException { Frame f = new Frame("UniversalActionListener Test");// Luodaan ikkuna. f.setLayout(new FlowLayout()); // Asettelunhallintaolio. Button b1 = new Button("tick"); // Luodaan napit. Button b2 = new Button("tock"); Button b3 = new Button("Close Window"); f.add(b1); f.add(b2); f.add(b3); // Lisätään ne ikkunaan. // Määritellään mitä napit tekevät. Kutsutaan metodia nimellä // UniversalActionListener-olion avulla. b1.addActionListener(new UniversalActionListener(b1,"setLabel", "tock")); b1.addActionListener(new UniversalActionListener(b2,"setLabel", "tick")); b1.addActionListener(new UniversalActionListener(b3,"hide", null)); b2.addActionListener(new UniversalActionListener(b1,"setLabel", "tick")); b2.addActionListener(new UniversalActionListener(b2,"setLabel", "tock")); b2.addActionListener(new UniversalActionListener(b3,"show", null)); b3.addActionListener(new UniversalActionListener(f, "dispose", null)); f.pack(); // Asetetaan ikkunan koko. f.show(); // Ja ikkuna näytetään. } }