Plik ActionSet.java
package reflectmet;
import javax.swing.*;
public class ActionSet {
public void dodaj() { show("Dodaj"); }
public void usuń() { show("Usuń"); }
public void zastąp() { show("Zastąp"); }
public void szukaj() { show("Szukaj"); }
public void otwórz() { show("Otwórz"); }
private void show(String string) {
JOptionPane.showMessageDialog(null, string);
}
}
Plik ReflectionTest.java
package reflectmet;
import java.lang.reflect.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ReflectionTest extends JFrame implements ActionListener {
Method currAction = null; // bieżąca metoda obsługi
Class actionClass = null; // klasa obsługi
Object actionObject = null; // obiekt obsługi
JPopupMenu popUp = null; // menu kontekstowe z wyborem obsługi
JButton b;
public ReflectionTest() {
super("Test refleksji");
try {
actionClass = Class.forName("reflectmet.ActionSet");
actionObject = actionClass.newInstance();
} catch (Exception exc) {
throw new RuntimeException("Wadliwa klasa obsługi");
}
popUp = new JPopupMenu();
createMenuItems();
b = new JButton("Użyj prawego klawisza myszki, by ustalić akcję");
b.setFont(new Font("Dialog", Font.BOLD, 24));
b.addActionListener(this);
b.setComponentPopupMenu(popUp);
setLayout(new FlowLayout());
add(b);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
void createMenuItems() {
Method mets[] = null;
try {
mets = actionClass.getMethods();
} catch (Exception exc) {
throw new RuntimeException("Niedostępna info o metodach klasy obsługi");
}
for (Method m : mets) {
if (m.getDeclaringClass() == actionClass) {
String name = m.getName();
JMenuItem mi = new JMenuItem(name);
mi.addActionListener(this);
popUp.add(mi);
}
}
}
void setCurrentAction(String action) {
try {
currAction = actionClass.getMethod(action); // zm. liczba arg.!!!
b.setText("Teraz akcją jest: " + currAction.getName() + " - kliknij!");
} catch (Exception exc) {
throw new RuntimeException("Nieznana metoda obsługi");
}
}
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if (src instanceof JMenuItem)
setCurrentAction(((JMenuItem) src).getText());
else {
try {
currAction.invoke(actionObject); // zmienna liczba arg. !!!
} catch (Exception exc) {
JOptionPane.showMessageDialog(null, "Akcja na przycisku nieustalona!");
}
}
}
public static void main(String args[]) {
new ReflectionTest();
}
}