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