Dynamic Action Hookup Test : Dynamic Proxy « Development Class « Java






Dynamic Action Hookup Test

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.Method;
import java.util.Hashtable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class DynamicHookupTest extends JFrame {
  DynamicActionAdapter actionAdapter = new DynamicActionAdapter();

  JLabel label = new JLabel("Ready...", JLabel.CENTER);

  int count;

  public DynamicHookupTest() {
    JButton launchButton = new JButton("Launch!");
    getContentPane().add(launchButton, "South");
    getContentPane().add(label, "Center");
    actionAdapter.hookup(launchButton, this, "launchTheMissiles");
  }

  public void launchTheMissiles() {
    label.setText("Launched: " + count++);
  }

  public static void main(String[] args) {
    JFrame f = new DynamicHookupTest();
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent we) {
        System.exit(0);
      }
    });
    f.setSize(150, 150);
    f.setVisible(true);
  }
}

class DynamicActionAdapter implements ActionListener {
  Hashtable actions = new Hashtable();

  public void hookup(Object sourceObject, Object targetObject, String targetMethod) {
    actions.put(sourceObject, new Target(targetObject, targetMethod));
    invokeReflectedMethod(sourceObject, "addActionListener", new Object[] { this },
        new Class[] { ActionListener.class });
  }

  public void actionPerformed(ActionEvent e) {
    Target target = (Target) actions.get(e.getSource());
    if (target == null)
      throw new RuntimeException("unknown source");
    invokeReflectedMethod(target.object, target.methodName, null, null);
  }

  private void invokeReflectedMethod(Object target, String methodName, Object[] args,
      Class[] argTypes) {

    try {
      Method method = target.getClass().getMethod(methodName, argTypes);
      method.invoke(target, args);
    } catch (Exception e) {
      throw new RuntimeException("invocation problem: " + e);
    }
  }

  class Target {
    Object object;

    String methodName;

    Target(Object object, String methodName) {
      this.object = object;
      this.methodName = methodName;
    }
  }
}

           
       








Related examples in the same category

1.Demonstrates a dangerous use of proxy names
2.Demonstrates the use of factories to generate proxies
3.Demonstrates a dynamic proxy
4.Demonstrates the usage of a counting proxy
5.Demonstrates the use of interface based proxies
6.Demonstrates the basic concept of proxies generated by clients to the proxies