介绍
对回调机制的再实现,有更好方法的请补充!
 
代码
 
核心类
/** 
*    
*/
 
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