package com.frameworkset.proxy;

import java.lang.reflect.Method;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author biaoping.yin
 * @version 1.0
 */
public class TestInvocationHandler extends InvocationHandler {
    /**
     * Processes a method invocation on a proxy instance and returns the
     * result.
     *
     * @param proxy the proxy instance that the method was invoked on
     * @param method the <code>Method</code> instance corresponding to the
     *   interface method invoked on the proxy instance. The declaring class
     *   of the <code>Method</code> object will be the interface that the
     *   method was declared in, which may be a superinterface of the proxy
     *   interface that the proxy class inherits the method through.
     * @param args an array of objects containing the values of the
     *   arguments passed in the method invocation on the proxy instance, or
     *   <code>null</code> if interface method takes no arguments. Arguments
     *   of primitive types are wrapped in instances of the appropriate
     *   primitive wrapper class, such as <code>java.lang.Integer</code> or
     *   <code>java.lang.Boolean</code>.
     * @return the value to return from the method invocation on the proxy
     *   instance. If the declared return type of the interface method is a
     *   primitive type, then the value returned by this method must be an
     *   instance of the corresponding primitive wrapper class; otherwise,
     *   it must be a type assignable to the declared return type. If the
     *   value returned by this method is <code>null</code> and the
     *   interface method's return type is primitive, then a
     *   <code>NullPointerException</code> will be thrown by the method
     *   invocation on the proxy instance. If the value returned by this
     *   method is otherwise not compatible with the interface method's
     *   declared return type as described above, a
     *   <code>ClassCastException</code> will be thrown by the method
     *   invocation on the proxy instance.
     * @throws Throwable the exception to throw from the method invocation
     *   on the proxy instance. The exception's type must be assignable
     *   either to any of the exception types declared in the
     *   <code>throws</code> clause of the interface method or to the
     *   unchecked exception types <code>java.lang.RuntimeException</code>
     *   or <code>java.lang.Error</code>. If a checked exception is thrown
     *   by this method that is not assignable to any of the exception types
     *   declared in the <code>throws</code> clause of the interface method,
     *   then an {@link UndeclaredThrowableException} containing the
     *   exception that was thrown by this method will be thrown by the
     *   method invocation on the proxy instance.
     * @todo Implement this java.lang.reflect.InvocationHandler method
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws
        Throwable {
        List list = new ArrayList();
        for(int i = 0; i < 5; i ++)
        {
            TestProxyImpl t = new TestProxyImpl();
            t.setString("hello" + i);
            list.add(t);
        }
        Object obj = method.invoke(super.delegate,args);
        for(int i = 0; i < 5; i ++)
        {
            System.out.println(obj);
            obj = method.invoke(list.get(i), args);
        }
        return obj;
    }
    public TestInvocationHandler(Object delegate)
    {
        super(delegate);
    }
    public static void main(String[] args) {
    }
}
