Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 import java.lang.reflect.*;
     17 import java.util.Arrays;
     18 
     19 class NarrowingTest {
     20 
     21    interface I1 {
     22        public Object foo();
     23    }
     24 
     25    interface I2 extends I1 {
     26        // Note that this method declaration narrows the return type.
     27        @Override
     28        public String foo();
     29    }
     30 
     31    public static void main(String[] args) {
     32        I2 proxy = (I2) Proxy.newProxyInstance(NarrowingTest.class.getClassLoader(),
     33                                               new Class<?>[] { I2.class },
     34                new InvocationHandler() {
     35                    int count = 0;
     36                    @Override
     37                    public Object invoke(Object proxy, Method method,
     38                                         Object[] args) throws Throwable {
     39                        System.out.println("Invocation of " + method);
     40                        if (count == 0) {
     41                            count++;
     42                            return "hello";
     43                        } else {
     44                            return Integer.valueOf(1);
     45                        }
     46                    }
     47                });
     48        Main.registerProxyClassName(proxy.getClass().getCanonicalName());
     49 
     50        Method[] methods = proxy.getClass().getDeclaredMethods();
     51        Arrays.sort(methods, new MethodComparator());
     52        System.out.println("Proxy methods: " +
     53                           Main.replaceProxyClassNamesForOutput(Arrays.deepToString(methods)));
     54 
     55        System.out.println("Invoking foo using I2 type: " + proxy.foo());
     56 
     57        I1 proxyAsParent = proxy;
     58        System.out.println("Invoking foo using I1 type: " + proxyAsParent.foo());
     59 
     60        try {
     61            proxy.foo();
     62            System.out.println("Didn't get expected exception");
     63        } catch (ClassCastException e) {
     64            // With an I2 invocation returning an integer is an exception.
     65            System.out.println("Got expected exception");
     66        }
     67 
     68        System.out.println("Proxy narrowed invocation return type passed");
     69    }
     70 }
     71