Mega Code Archive

 
Categories / Java / Reflection
 

This program demonstrates the use of proxies and reflection

/*    This program is a part of the companion code for Core Java 8th ed.    (http://horstmann.com/corejava)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see <http://www.gnu.org/licenses/>. */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; import java.util.Random; /**  * This program demonstrates the use of proxies.  * @version 1.00 2000-04-13  * @author Cay Horstmann  */ public class ProxyTest {    public static void main(String[] args)    {       Object[] elements = new Object[1000];       // fill elements with proxies for the integers 1 ... 1000       for (int i = 0; i < elements.length; i++)       {          Integer value = i + 1;          InvocationHandler handler = new TraceHandler(value);          Object proxy = Proxy.newProxyInstance(null, new Class[] { Comparable.class } , handler);          elements[i] = proxy;       }       // construct a random integer       Integer key = new Random().nextInt(elements.length) + 1;       // search for the key       int result = Arrays.binarySearch(elements, key);       // print match if found       if (result >= 0) System.out.println(elements[result]);    } } /**  * An invocation handler that prints out the method name and parameters, then  * invokes the original method  */ class TraceHandler implements InvocationHandler {    /**     * Constructs a TraceHandler     * @param t the implicit parameter of the method call     */    public TraceHandler(Object t)    {       target = t;    }    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable    {       // print implicit argument       System.out.print(target);       // print method name       System.out.print("." + m.getName() + "(");       // print explicit arguments       if (args != null)       {          for (int i = 0; i < args.length; i++)          {             System.out.print(args[i]);             if (i < args.length - 1) System.out.print(", ");          }       }       System.out.println(")");       // invoke actual method       return m.invoke(target, args);    }    private Object target; }