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.io.IOException;
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.InvocationHandler;
195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.InvocationTargetException;
205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Method;
215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Proxy;
225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.UndeclaredThrowableException;
235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Create a Proxy class that blah.
265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class WrappedThrow {
285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static void main(String[] args) {
295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        WTMix mix = new WTMix();
305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        InvocationHandler handler = new WTInvocationHandler(mix);
315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object proxy;
325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            proxy = Proxy.newProxyInstance(WrappedThrow.class.getClassLoader(),
355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                new Class[] { InterfaceW1.class, InterfaceW2.class },
365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                handler);
375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IllegalArgumentException iae) {
385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("WT init failed");
395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return;
405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        InterfaceW1 if1 = (InterfaceW1) proxy;
435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        InterfaceW2 if2 = (InterfaceW2) proxy;
445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if1.throwFunky();
465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (UndeclaredThrowableException ute) {
485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected UTE");
495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if1.throwFunky2();
555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IOException ioe) {
575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected IOE");
585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if2.throwFunky2();
645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IOException ioe) {
665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected IOE");
675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        /*
725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao         * Throw exceptions, walking down the hierarchy.
735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao         */
745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if1.throwException();
765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (UndeclaredThrowableException ute) {
785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected UTE");
795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if1.throwBase();
855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (UndeclaredThrowableException ute) {
875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected UTE");
885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if2.throwSub();
945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (SubException se) {
965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected exception");
975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
1025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if2.throwSubSub();
1035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
1045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (SubException se) {
1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected exception");
1065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
1085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        /*
1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao         * Make sure that, if the class explicitly allows the base
1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao         * class of an exception, that we still allow it.
1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao         */
1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if1.bothThrowBase();
1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("No exception thrown");
1175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (BaseException se) {
1185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Got expected exception");
1195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (Throwable t) {
1205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("Got unexpected exception: " + t);
1215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
1245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass BaseException extends Exception {}
1265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass SubException extends BaseException {}
1275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass SubSubException extends SubException {}
1285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaointerface InterfaceW1 {
1305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwFunky();
1315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwFunky2() throws BaseException,
1335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao           NoSuchMethodException, IOException;
1345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwException() throws BaseException;
1365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwBase() throws BaseException;
1375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSub() throws BaseException;
1385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSubSub() throws BaseException;
1395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void bothThrowBase() throws BaseException, SubException, SubSubException;
1415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
1425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaointerface InterfaceW2 {
1445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwFunky2() throws InterruptedException,
1455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao           NoSuchMethodException, IOException;
1465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwException() throws SubException;
1485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwBase() throws SubException;
1495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSub() throws SubException;
1505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSubSub() throws SubException;
1515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void bothThrowBase() throws SubException, BaseException, SubSubException;
1535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
1545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/**
1565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Implement all of the proxied interfaces.
1575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
1585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass WTMix implements InterfaceW1, InterfaceW2 {
1595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int dastardlyDeed() throws SubException {
1605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Throwing SubException");
1615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        throw new SubException();
1625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /* these don't actually get called; they just cause exceptions */
1655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwFunky() {}
1665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwFunky2() {}
1675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwException() throws SubException {}
1685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwBase() throws SubException {}
1695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSub() throws SubException {}
1705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwSubSub() throws SubException {}
1715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void bothThrowBase() throws BaseException, SubException {}
1735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
1745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/**
1765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Invocation handler for our proxy class.
1775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
1785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass WTInvocationHandler implements InvocationHandler {
1795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private Object mObj;
1805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public WTInvocationHandler(Object obj) {
1825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        mObj = obj;
1835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /*
1865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * This is called when anything gets invoked in the proxy object.
1875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
1885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public Object invoke(Object proxy, Method method, Object[] args)
1895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        throws Throwable {
1905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object result = null;
1925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        // Trap Object calls.  This is important here to avoid a recursive
1945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        // invocation of toString() in the print statements below.
1955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if (method.getDeclaringClass() == java.lang.Object.class) {
1965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            //System.out.println("!!! object " + method.getName());
1975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("toString"))
1985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                return super.toString();
1995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            else if (method.getName().equals("hashCode"))
2005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                return Integer.valueOf(super.hashCode());
2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            else if (method.getName().equals("equals"))
2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                return Boolean.valueOf(super.equals(args[0]));
2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            else
2045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new RuntimeException("huh?");
2055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
2065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Invoke " + method);
2085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if (args == null || args.length == 0) {
2095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println(" (no args)");
2105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } else {
2115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            for (int i = 0; i < args.length; i++)
2125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println(" " + i + ": " + args[i]);
2135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
2145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
2165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwFunky"))
2175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new InterruptedException("fake");
2185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwFunky2"))
2195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new IOException("fake2");
2205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwException"))
2215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new Exception();
2225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwBase"))
2235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new BaseException();
2245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwSub"))
2255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new SubException();
2265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("throwSubSub"))
2275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new SubSubException();
2285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (method.getName().equals("bothThrowBase"))
2295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new BaseException();
2305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (true)
2325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                result = method.invoke(mObj, args);
2335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            else
2345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                result = -1;
2355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Success: method " + method.getName()
2365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                + " res=" + result);
2375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (InvocationTargetException ite) {
2385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            throw ite.getTargetException();
2395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IllegalAccessException iae) {
2405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            throw new RuntimeException(iae);
2415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
2425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return result;
2435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
2445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
245