1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.annotation.Annotation; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.InvocationHandler; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Constructor; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Field; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Method; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Proxy; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do some basic tests. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class BasicTest { 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void main(String[] args) { 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Mix proxyMe = new Mix(); 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object proxy = createProxy(proxyMe); 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!Proxy.isProxyClass(proxy.getClass())) 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("not a proxy class?"); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (Proxy.getInvocationHandler(proxy) == null) 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("ERROR: Proxy.getInvocationHandler is null"); 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* take it for a spin; verifies instanceof constraint */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Shapes shapes = (Shapes) proxy; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project shapes.circle(3); 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project shapes.rectangle(10, 20); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project shapes.blob(); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Quads quads = (Quads) proxy; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project quads.rectangle(15, 25); 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project quads.trapezoid(6, 81.18, 4); 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Colors colors = (Colors) proxy; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project colors.red(1.0f); 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project colors.blue(777); 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project colors.mauve("sorry"); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project colors.blob(); 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project shapes.upChuck(); 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Didn't get expected exception"); 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IndexOutOfBoundsException ioobe) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Got expected ioobe"); 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project shapes.upCheck(); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Didn't get expected exception"); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InterruptedException ie) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Got expected ie"); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exercise annotations on Proxy classes. This is mostly to ensure 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that annotation calls work correctly on generated classes. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(""); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method[] methods = proxy.getClass().getDeclaredMethods(); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Proxy methods: " + Arrays.deepToString(methods)); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method meth = methods[methods.length -1]; 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Decl annos: " + Arrays.deepToString(meth.getDeclaredAnnotations())); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation[][] paramAnnos = meth.getParameterAnnotations(); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Param annos (" + paramAnnos.length + ") : " 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + Arrays.deepToString(paramAnnos)); 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field[] fields = proxy.getClass().getDeclaredFields(); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Proxy fields: " + Arrays.deepToString(fields)); 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static Object createProxy(Object proxyMe) { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* declare an object that will handle the method calls */ 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InvocationHandler handler = new MyInvocationHandler(proxyMe); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* create the proxy class */ 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Class proxyClass = Proxy.getProxyClass(Shapes.class.getClassLoader(), 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new Class[] { Quads.class, Colors.class }); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* create a proxy object, passing the handler object in */ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object proxy = null; 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Constructor<Class> cons; 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cons = proxyClass.getConstructor( 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new Class[] { InvocationHandler.class }); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //System.out.println("Constructor is " + cons); 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project proxy = cons.newInstance(new Object[] { handler }); 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (NoSuchMethodException nsme) { 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("failed: " + nsme); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InstantiationException ie) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("failed: " + ie); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalAccessException ie) { 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("failed: " + ie); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InvocationTargetException ite) { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println("failed: " + ite); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return proxy; 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some interfaces. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinterface Shapes { 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void circle(int r); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int rectangle(int x, int y); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String blob(); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public R0base checkMe(); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void upChuck(); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void upCheck() throws InterruptedException; 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinterface Quads extends Shapes { 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int rectangle(int x, int y); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int square(int x, int y); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int trapezoid(int x, double off, int y); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public R0a checkMe(); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * More interfaces. 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinterface Colors { 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int red(float howRed); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int green(double howGreen); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public double blue(int howBlue); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int mauve(String apology); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String blob(); 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public R0aa checkMe(); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some return types. 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass R0base { int mBlah; } 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass R0a extends R0base { int mBlah_a; } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass R0aa extends R0a { int mBlah_aa; } 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A class that implements them all. 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass Mix implements Quads, Colors { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void circle(int r) { 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- circle " + r); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int rectangle(int x, int y) { 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- rectangle " + x + "," + y); 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 4; 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int square(int x, int y) { 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- square " + x + "," + y); 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 4; 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int trapezoid(int x, double off, int y) { 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- trap " + x + "," + y + "," + off); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 8; 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String blob() { 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- blob"); 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "mix"; 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int red(float howRed) { 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- red " + howRed); 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int green(double howGreen) { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- green " + howGreen); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 1; 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public double blue(int howBlue) { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- blue " + howBlue); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 2.54; 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int mauve(String apology) { 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("--- mauve " + apology); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 3; 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public R0aa checkMe() { 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void upChuck() { 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException("upchuck"); 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void upCheck() throws InterruptedException { 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InterruptedException("upcheck"); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation handler, defining the implementation of the proxy functions. 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass MyInvocationHandler implements InvocationHandler { 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object mObj; 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public MyInvocationHandler(Object obj) { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mObj = obj; 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is called when anything gets invoked in the proxy object. 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Object invoke(Object proxy, Method method, Object[] args) 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws Throwable { 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object result = null; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Trap Object calls. This is important here to avoid a recursive 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // invocation of toString() in the print statements below. 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (method.getDeclaringClass() == java.lang.Object.class) { 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //System.out.println("!!! object " + method.getName()); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (method.getName().equals("toString")) 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return super.toString(); 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (method.getName().equals("hashCode")) 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Integer.valueOf(super.hashCode()); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (method.getName().equals("equals")) 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Boolean.valueOf(super.equals(args[0])); 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("huh?"); 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Invoke " + method); 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (args == null || args.length == 0) { 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(" (no args)"); 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < args.length; i++) 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println(" " + i + ": " + args[i]); 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (true) 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = method.invoke(mObj, args); 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = -1; 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.println("Success: method " + method.getName() 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + " res=" + result); 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InvocationTargetException ite) { 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ite.getTargetException(); 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalAccessException iae) { 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException(iae); 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 264