15d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 25d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Copyright (C) 2008 The Android Open Source Project 35d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 45d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 55d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * you may not use this file except in compliance with the License. 65d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * You may obtain a copy of the License at 75d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 85d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * http://www.apache.org/licenses/LICENSE-2.0 95d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Unless required by applicable law or agreed to in writing, software 115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * distributed under the License is distributed on an "AS IS" BASIS, 125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * See the License for the specific language governing permissions and 145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * limitations under the License. 155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.annotation.Annotation; 185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.InvocationHandler; 195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.InvocationTargetException; 205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Constructor; 215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Field; 225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Method; 235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Proxy; 245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.util.Arrays; 25466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogersimport java.util.Comparator; 265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/** 285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Do some basic tests. 295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class BasicTest { 315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public static void main(String[] args) { 335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Mix proxyMe = new Mix(); 345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object proxy = createProxy(proxyMe); 355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (!Proxy.isProxyClass(proxy.getClass())) 375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("not a proxy class?"); 385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (Proxy.getInvocationHandler(proxy) == null) 395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("ERROR: Proxy.getInvocationHandler is null"); 405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* take it for a spin; verifies instanceof constraint */ 425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Shapes shapes = (Shapes) proxy; 435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao shapes.circle(3); 445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao shapes.rectangle(10, 20); 455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao shapes.blob(); 465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Quads quads = (Quads) proxy; 475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao quads.rectangle(15, 25); 485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao quads.trapezoid(6, 81.18, 4); 495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Colors colors = (Colors) proxy; 505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao colors.red(1.0f); 515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao colors.blue(777); 525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao colors.mauve("sorry"); 535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao colors.blob(); 54228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao Trace trace = (Trace) proxy; 55228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao trace.getTrace(); 565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao shapes.upChuck(); 595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Didn't get expected exception"); 605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (IndexOutOfBoundsException ioobe) { 615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Got expected ioobe"); 625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao shapes.upCheck(); 655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Didn't get expected exception"); 665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (InterruptedException ie) { 675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Got expected ie"); 685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* 715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Exercise annotations on Proxy classes. This is mostly to ensure 725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * that annotation calls work correctly on generated classes. 735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println(""); 755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Method[] methods = proxy.getClass().getDeclaredMethods(); 76466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers Arrays.sort(methods, new Comparator<Method>() { 77466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers public int compare(Method o1, Method o2) { 78ecbce8f17a80ddc8e5d80b075a8e334f1c2daf3cJesse Wilson int result = o1.getName().compareTo(o2.getName()); 79ecbce8f17a80ddc8e5d80b075a8e334f1c2daf3cJesse Wilson if (result != 0) { 80ecbce8f17a80ddc8e5d80b075a8e334f1c2daf3cJesse Wilson return result; 81ecbce8f17a80ddc8e5d80b075a8e334f1c2daf3cJesse Wilson } 82ecbce8f17a80ddc8e5d80b075a8e334f1c2daf3cJesse Wilson return o1.getReturnType().getName().compareTo(o2.getReturnType().getName()); 83466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers } 84466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers }); 852ed52c4419dd537c98cd7898bc8bdcf8826b8940Elliott Hughes System.out.println("Proxy interfaces: " + 862ed52c4419dd537c98cd7898bc8bdcf8826b8940Elliott Hughes Arrays.deepToString(proxy.getClass().getInterfaces())); 8775d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi System.out.println("Proxy methods: " + 8875d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi Main.replaceProxyClassNamesForOutput(Arrays.deepToString(methods))); 895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Method meth = methods[methods.length -1]; 905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Decl annos: " + Arrays.deepToString(meth.getDeclaredAnnotations())); 915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Annotation[][] paramAnnos = meth.getParameterAnnotations(); 925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Param annos (" + paramAnnos.length + ") : " 935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao + Arrays.deepToString(paramAnnos)); 944460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom System.out.println("Modifiers: " + meth.getModifiers()); 955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao static Object createProxy(Object proxyMe) { 985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* declare an object that will handle the method calls */ 995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao InvocationHandler handler = new MyInvocationHandler(proxyMe); 1005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* create the proxy class */ 1025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Class proxyClass = Proxy.getProxyClass(Shapes.class.getClassLoader(), 103228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao new Class[] { Quads.class, Colors.class, Trace.class }); 10475d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi Main.registerProxyClassName(proxyClass.getCanonicalName()); 1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* create a proxy object, passing the handler object in */ 1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object proxy = null; 1085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 1095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Constructor<Class> cons; 1105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao cons = proxyClass.getConstructor( 1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao new Class[] { InvocationHandler.class }); 1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao //System.out.println("Constructor is " + cons); 1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao proxy = cons.newInstance(new Object[] { handler }); 1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (NoSuchMethodException nsme) { 1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("failed: " + nsme); 1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (InstantiationException ie) { 1175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("failed: " + ie); 1185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (IllegalAccessException ie) { 1195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("failed: " + ie); 1205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (InvocationTargetException ite) { 1215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("failed: " + ite); 1225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return proxy; 1255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 1275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 1295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Some interfaces. 1305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaointerface Shapes { 1325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void circle(int r); 1335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int rectangle(int x, int y); 1345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public String blob(); 1365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public R0base checkMe(); 1385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void upChuck(); 1395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void upCheck() throws InterruptedException; 1405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 1415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaointerface Quads extends Shapes { 1435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int rectangle(int x, int y); 1445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int square(int x, int y); 1455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int trapezoid(int x, double off, int y); 1465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public R0a checkMe(); 1485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 1495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 1515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * More interfaces. 1525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaointerface Colors { 1545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int red(float howRed); 1555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int green(double howGreen); 1565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public double blue(int howBlue); 1575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int mauve(String apology); 1585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public String blob(); 1605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public R0aa checkMe(); 1625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 1635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 164228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Haointerface Trace { 165228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao public void getTrace(); 166228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao} 167228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao 1685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 1695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Some return types. 1705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass R0base { int mBlah; } 1725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass R0a extends R0base { int mBlah_a; } 1735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass R0aa extends R0a { int mBlah_aa; } 1745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 1775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * A class that implements them all. 1785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass Mix implements Quads, Colors { 1805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void circle(int r) { 1815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- circle " + r); 1825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int rectangle(int x, int y) { 1845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- rectangle " + x + "," + y); 1855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 4; 1865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int square(int x, int y) { 1885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- square " + x + "," + y); 1895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 4; 1905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int trapezoid(int x, double off, int y) { 1925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- trap " + x + "," + y + "," + off); 1935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 8; 1945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public String blob() { 1965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- blob"); 1975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return "mix"; 1985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int red(float howRed) { 2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- red " + howRed); 2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 0; 2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int green(double howGreen) { 2055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- green " + howGreen); 2065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 1; 2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public double blue(int howBlue) { 2095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- blue " + howBlue); 2105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 2.54; 2115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public int mauve(String apology) { 2135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("--- mauve " + apology); 2145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return 3; 2155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public R0aa checkMe() { 2185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return null; 2195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void upChuck() { 2215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw new IndexOutOfBoundsException("upchuck"); 2225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void upCheck() throws InterruptedException { 2245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw new InterruptedException("upcheck"); 2255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 2275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 2295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Invocation handler, defining the implementation of the proxy functions. 2305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 2315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass MyInvocationHandler implements InvocationHandler { 2325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object mObj; 2335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public MyInvocationHandler(Object obj) { 2355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao mObj = obj; 2365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* 2395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * This is called when anything gets invoked in the proxy object. 2405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 2415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public Object invoke(Object proxy, Method method, Object[] args) 2425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throws Throwable { 2435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object result = null; 2455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao // Trap Object calls. This is important here to avoid a recursive 2475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao // invocation of toString() in the print statements below. 2485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (method.getDeclaringClass() == java.lang.Object.class) { 2495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao //System.out.println("!!! object " + method.getName()); 2504460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom if (method.getName().equals("toString")) { 2515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return super.toString(); 2524460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } else if (method.getName().equals("hashCode")) { 2535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return Integer.valueOf(super.hashCode()); 2544460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } else if (method.getName().equals("equals")) { 2555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return Boolean.valueOf(super.equals(args[0])); 2564460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } else { 2575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw new RuntimeException("huh?"); 2584460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } 2595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 261228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao if (method.getDeclaringClass() == Trace.class) { 262228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao if (method.getName().equals("getTrace")) { 263228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 264228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao for (int i = 0; i < stackTrace.length; i++) { 265228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao StackTraceElement ste = stackTrace[i]; 266228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao if (ste.getMethodName().equals("getTrace")) { 26775d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi String outputClassName = Main.replaceProxyClassNamesForOutput(ste.getClassName()); 26875d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi System.out.println(outputClassName + "." + ste.getMethodName() + " " + 2693057f46f8176f7ef5801eb2676a41365bea82805Jeff Hao ste.getFileName() + ":" + ste.getLineNumber()); 2703057f46f8176f7ef5801eb2676a41365bea82805Jeff Hao } 2713057f46f8176f7ef5801eb2676a41365bea82805Jeff Hao } 2723057f46f8176f7ef5801eb2676a41365bea82805Jeff Hao return null; 2733057f46f8176f7ef5801eb2676a41365bea82805Jeff Hao } 2745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2763addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao if (method.getDeclaringClass() == Trace.class) { 2773addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao if (method.getName().equals("getTrace")) { 2783addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 2793addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao for (int i = 0; i < stackTrace.length; i++) { 2803addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao StackTraceElement ste = stackTrace[i]; 2813addc29228cb3a2d263e1d91a0b7d4e0fe26e246Jeff Hao if (ste.getMethodName().equals("getTrace")) { 28275d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi String outputClassName = Main.replaceProxyClassNamesForOutput(ste.getClassName()); 28375d505305be25f9d4e35bfe883b2faa8f7a7f8e3Hiroshi Yamauchi System.out.println(outputClassName + "." + ste.getMethodName() + " " + 284228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao ste.getFileName() + ":" + ste.getLineNumber()); 285228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao } 286228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao } 287228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao return null; 288228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao } 289228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao } 290228d6b8a4f0a21c1e9b2372c3104ce4ee19f65b4Jeff Hao 2915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Invoke " + method); 2925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (args == null || args.length == 0) { 2935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println(" (no args)"); 2945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } else { 2955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao for (int i = 0; i < args.length; i++) 2965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println(" " + i + ": " + args[i]); 2975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 3004460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom if (true) { 3015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao result = method.invoke(mObj, args); 3024460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } else { 3035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao result = -1; 3044460ea6b35d81fd8a5ad531fb13b506206476b95Brian Carlstrom } 3055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("Success: method " + method.getName() 3065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao + " res=" + result); 3075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (InvocationTargetException ite) { 3085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw ite.getTargetException(); 3095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (IllegalAccessException iae) { 3105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw new RuntimeException(iae); 3115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 3125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao return result; 3135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 3145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 315