| /* |
| * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * - Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * - Neither the name of Oracle nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| import java.io.IOException; |
| import java.lang.reflect.Field; |
| |
| /** |
| * The example illustrates how to use the default method for mixin. |
| * @see BuildType |
| * @see Debuggable |
| */ |
| public class MixIn { |
| |
| /** |
| * Implement this interface for a class that must be in debug print |
| */ |
| public interface Debuggable { |
| |
| /** |
| * Print the class name and all fields to a string. Uses reflection to |
| * obtain and access fields of this object. |
| * |
| * @return the string formatted like the following: <pre> |
| * State of the: <Class Name> |
| * <member name> : <value> |
| * ... |
| * </pre> |
| */ |
| default String toDebugString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("State of the: ").append( |
| this.getClass().getSimpleName()).append("\n"); |
| for (Class cls = this.getClass(); |
| cls != null; |
| cls = cls.getSuperclass()) { |
| for (Field f : cls.getDeclaredFields()) { |
| try { |
| f.setAccessible(true); |
| sb.append(f.getName()).append(" : "). |
| append(f.get(this)).append("\n"); |
| } catch (IllegalAccessException e) { |
| } |
| } |
| } |
| return sb.toString(); |
| } |
| } |
| |
| /** |
| * Sample exception class to demonstrate mixin. This enum inherits the |
| * behavior of the {@link Debuggable} |
| */ |
| public static enum BuildType implements Debuggable { |
| |
| BUILD(0, "-build"), |
| PLAN(0, "-plan"), |
| EXCLUDE(1, "-exclude"), |
| TOTAL(2, "-total"); |
| |
| private final int compareOrder; |
| private final String pathSuffix; |
| |
| private BuildType(int compareOrder, String pathSuffix) { |
| this.compareOrder = compareOrder; |
| this.pathSuffix = pathSuffix; |
| } |
| |
| public int getCompareOrder() { |
| return compareOrder; |
| } |
| |
| public String getPathSuffix() { |
| return pathSuffix; |
| } |
| } |
| |
| /** |
| * Illustrate the behavior of the MixClass |
| * |
| * @param args command-line arguments |
| * @throws java.io.IOException internal demo error |
| */ |
| public static void main(final String[] args) throws IOException { |
| System.out.println(BuildType.BUILD.toDebugString()); |
| } |
| } |