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