Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/sample/lambda/DefaultMethods/Reflection.java
38829 views
/*1* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6*7* - Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9*10* - Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* - Neither the name of Oracle nor the names of its15* contributors may be used to endorse or promote products derived16* from this software without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS19* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,20* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR21* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR22* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,23* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,24* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR25* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF26* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING27* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS28* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031import java.lang.reflect.InvocationTargetException;32import java.lang.reflect.Method;33import java.util.Arrays;34import java.util.stream.Stream;3536/**37* The code sample illustrates changes in the reflection API linked38* <b>default methods</b>. Since Java SE 8, a new method is added into the class39* <b><code>java.lang.reflect.Method</code></b>, with which you can reflectively40* determine whether or not a default method provided by an interface41* (<b><code>Method.isDefault()</code></b>).42*/43public class Reflection {4445/**46* Base interface to illustrate the new reflection API.47*48* @see Dog49*/50public interface Animal {5152/**53* Return string representation of the eat action for Animal54*55* @return string representation of the eat action for Animal56*/57default String eat() {58return this.getClass().getSimpleName()59+ " eats like an ordinary animal";60}6162/**63* Return string representation of the sleep action for Animal64*65* @return string representation of the sleep action for Animal66*/67default String sleep() {68return this.getClass().getSimpleName()69+ " sleeps like an ordinary animal";70}7172/**73* Return string representation of the go action for Animal74*75* @return string representation of the go action for Animal76*/77String go();78}7980/**81* Dog class to illustrate the new reflection API. You can see that:82* <ul>83* <li> the {@link #go} and {@link #sleep} methods are not default.84* {@link #go} is not the default implementation and the {@link #sleep}85* method implementation wins as subtype (according with {@link Inheritance}86* rule. 2) </li>87* <li> the {@link #eat} is a simple default method that is not overridden88* in this class.89* </li>90* </ul>91*/92public static class Dog implements Animal {9394/**95* Return string representation of the go action for Dog96*97* @return string representation of the go action for Dog98*/99@Override100public String go() {101return "Dog walks on four legs";102}103104/**105* Return string representation of the sleep action for Dog106*107* @return string representation of the sleep action for Dog108*/109@Override110public String sleep() {111return "Dog sleeps";112}113}114115/**116* Illustrate the usage of the method java.lang.reflect.Method.isDefault()117*118* @param args command-line arguments119* @throws NoSuchMethodException internal demo error120*/121public static void main(final String[] args) throws NoSuchMethodException {122Dog dog = new Dog();123Stream.of(Dog.class.getMethod("eat"), Dog.class.getMethod("go"), Dog.class.getMethod("sleep"))124.forEach((m) -> {125System.out.println("Method name: " + m.getName());126System.out.println(" isDefault: " + m.isDefault());127System.out.print(" invoke: ");128try {129m.invoke(dog);130} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {131}132System.out.println();133});134}135}136137138