Home | History | Annotate | Download | only in DefaultMethods
      1 /*
      2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  *   - Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  *
     11  *   - Redistributions in binary form must reproduce the above copyright
     12  *     notice, this list of conditions and the following disclaimer in the
     13  *     documentation and/or other materials provided with the distribution.
     14  *
     15  *   - Neither the name of Oracle nor the names of its
     16  *     contributors may be used to endorse or promote products derived
     17  *     from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 import java.lang.reflect.InvocationTargetException;
     33 import java.lang.reflect.Method;
     34 import java.util.Arrays;
     35 import java.util.stream.Stream;
     36 
     37 /**
     38  * The code sample illustrates changes in the reflection API linked
     39  * <b>default methods</b>. Since Java SE 8, a new method is added into the class
     40  * <b><code>java.lang.reflect.Method</code></b>, with which you can reflectively
     41  * determine whether or not a default method provided by an interface
     42  * (<b><code>Method.isDefault()</code></b>).
     43  */
     44 public class Reflection {
     45 
     46     /**
     47      * Base interface to illustrate the new reflection API.
     48      *
     49      * @see Dog
     50      */
     51     public interface Animal {
     52 
     53         /**
     54          * Return string representation of the eat action for Animal
     55          *
     56          * @return string representation of the eat action for Animal
     57          */
     58         default String eat() {
     59             return this.getClass().getSimpleName()
     60                     + " eats like an ordinary animal";
     61         }
     62 
     63         /**
     64          * Return string representation of the sleep action for Animal
     65          *
     66          * @return string representation of the sleep action for Animal
     67          */
     68         default String sleep() {
     69             return this.getClass().getSimpleName()
     70                     + " sleeps like an ordinary animal";
     71         }
     72 
     73         /**
     74          * Return string representation of the go action for Animal
     75          *
     76          * @return string representation of the go action for Animal
     77          */
     78         String go();
     79     }
     80 
     81     /**
     82      * Dog class to illustrate the new reflection API. You can see that:
     83      * <ul>
     84      * <li> the {@link #go} and {@link #sleep} methods are not default.
     85      * {@link #go} is not the default implementation and the {@link #sleep}
     86      * method implementation wins as subtype (according with {@link Inheritance}
     87      * rule. 2) </li>
     88      * <li> the {@link #eat} is a simple default method that is not overridden
     89      * in this class.
     90      * </li>
     91      * </ul>
     92      */
     93     public static class Dog implements Animal {
     94 
     95         /**
     96          * Return string representation of the go action for Dog
     97          *
     98          * @return string representation of the go action for Dog
     99          */
    100         @Override
    101         public String go() {
    102             return "Dog walks on four legs";
    103         }
    104 
    105         /**
    106          * Return string representation of the sleep action for Dog
    107          *
    108          * @return string representation of the sleep action for Dog
    109          */
    110         @Override
    111         public String sleep() {
    112             return "Dog sleeps";
    113         }
    114     }
    115 
    116     /**
    117      * Illustrate the usage of the method java.lang.reflect.Method.isDefault()
    118      *
    119      * @param args command-line arguments
    120      * @throws NoSuchMethodException internal demo error
    121      */
    122     public static void main(final String[] args) throws NoSuchMethodException {
    123         Dog dog = new Dog();
    124         Stream.of(Dog.class.getMethod("eat"), Dog.class.getMethod("go"), Dog.class.getMethod("sleep"))
    125                 .forEach((m) -> {
    126                     System.out.println("Method name:   " + m.getName());
    127                     System.out.println("    isDefault: " + m.isDefault());
    128                     System.out.print("    invoke:    ");
    129                     try {
    130                         m.invoke(dog);
    131                     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
    132                     }
    133                     System.out.println();
    134                 });
    135     }
    136 }
    137