介绍
对回调机制的再实现,有更好方法的请补充!
 
代码
 
核心类
/**
*    
*/

package callback;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
*    This is a callback controller
* @author daniel zhou
*
*/

public class CallbackDispatcher {

  private Map _ifaceToHandler =new HashMap();
    
  private static class CallbackHandler implements InvocationHandler{
    
    private Set _listeners = new HashSet();
    private CallbackType _type;
    
    public CallbackHandler(CallbackType type){
      _type=type;
    }
    
    private void addListener(Object o){
      synchronized (_listeners) {
        _listeners.add(o);
      }
    }
    
    private void removeListener(Object o) {
                         synchronized (_listeners) {
                                 _listeners.remove(o);
                         }
         }
        
    public Object invoke(Object proxy, Method meth, Object[] methArgs) throws Throwable{
      Set listeners;
      synchronized(_listeners){
        listeners = new HashSet(_listeners);
      }
      return _type.callListeners(meth, methArgs, listeners);
    }
  }

  /**
    * register an listener
    * @param iFace
    * @param o
    */

  public void registerListener(Class iFace, Object o){
    CallbackHandler handler;
    //check registered or not
    if (!iFace.isAssignableFrom(o.getClass())) {
      throw new IllegalArgumentException("Object [" + o + "] does not " +
                                        "implement [" + iFace.getName() +
                        "]");
    }
    //try to get the callbackhandler
    synchronized(_ifaceToHandler){
      handler = (CallbackHandler) _ifaceToHandler.get(iFace);
    }
    //not register and warn
    if (handler==null) {
        throw new IllegalArgumentException("No callback for interface [" +
                                         iFace.getName() + "] exists");
    }
    //register
    handler.addListener(o);
  }

  /**
    * unregister
    * @param iFace
    * @param o
    */

  public void unregisterListener(Class iFace, Object o){
    CallbackHandler handler;
    //get the callback handler
    synchronized(_ifaceToHandler){
      handler = (CallbackHandler) _ifaceToHandler.get(iFace);
    }
    //unregister
    if (handler!=null) {
      handler.removeListener(o);
    }    
  }
    
  /**
         * Generates a caller with the callback type of    
         * {@link CallbackType.RETURN_LAST}
         *    
         * @see #generateCaller(Class, CallbackType)
         */

        public Object generateCaller(Class iFace) {
                return generateCaller(iFace, CallbackType.RETURN_LAST);
        }
        
        /**
         * Generates the 'caller' side of the caller/listener relationship.    
         *    
         * When methods on the returned object are invoked, the listeners    
         * registered via {@link #registerListener(Class, Object)} for the given
         * interface will be executed.
         *    
         * The execution of the callbacks, the order they are called, the    
         * exception handling, values returned etc. are all handled by the passed    
         * {@link CallbackType}.
         *    
         * @param iFace Interface to generate the caller for
         * @param type    Type specifying the way that the caller will process
         *                            callbacks
         *
         * @return An object implementing the passed interface.    The methods on
         *                 this object will execute callbacks on registered listeners.
         */

        public Object generateCaller(Class iFace, CallbackType type) {
                CallbackHandler newHandler;
                Object src;
                
                if (!iFace.isInterface()) {
                        throw new IllegalArgumentException("Class [" + iFace.getName() +
                                                                                             "] is not an interface");
                }
                
                newHandler = new CallbackHandler(type);
                src = Proxy.newProxyInstance(iFace.getClassLoader(),    
                                                                         new Class[] { iFace }, newHandler);
                synchronized(_ifaceToHandler) {
                        if (_ifaceToHandler.containsKey(iFace)) {
                                throw new IllegalArgumentException("Caller already generated " +
                                                                                                     " for interface [" +    
                                                                                                     iFace.getName() + "]");
                        }
                        
                        _ifaceToHandler.put(iFace, newHandler);
                }
                return src;
        }


}

 
测试类
/**
*    
*/

package schedular;

import callback.CallbackDispatcher;

/**
* @author daniel zhou
*
*/

public class Schedulaer_Test {


  /**
    * @param args
    */

  public static void main(String[] args) {
    //callbacks handler
    CallbackDispatcher    _callbacks = new CallbackDispatcher();
    //caller handler
    ShutdownCallback _caller = (ShutdownCallback) _callbacks.generateCaller(ShutdownCallback.class);    
    //new implement
    ShutdownCallback _shutdown = new ShutdownCallback(){

      @Override
      public void shutdown() {
        System.out.println("I have been called!");        
      }
        
    };
    //register
    _callbacks.registerListener(ShutdownCallback.class, _shutdown);
    
    //call    
    _caller.shutdown();
         }
}
 
Source Code Download