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.io.IOException; 33 import java.lang.reflect.Field; 34 35 /** 36 * The example illustrates how to use the default method for mixin. 37 * @see BuildType 38 * @see Debuggable 39 */ 40 public class MixIn { 41 42 /** 43 * Implement this interface for a class that must be in debug print 44 */ 45 public interface Debuggable { 46 47 /** 48 * Print the class name and all fields to a string. Uses reflection to 49 * obtain and access fields of this object. 50 * 51 * @return the string formatted like the following: <pre> 52 * State of the: <Class Name> 53 * <member name> : <value> 54 * ... 55 * </pre> 56 */ 57 default String toDebugString() { 58 StringBuilder sb = new StringBuilder(); 59 sb.append("State of the: ").append( 60 this.getClass().getSimpleName()).append("\n"); 61 for (Class cls = this.getClass(); 62 cls != null; 63 cls = cls.getSuperclass()) { 64 for (Field f : cls.getDeclaredFields()) { 65 try { 66 f.setAccessible(true); 67 sb.append(f.getName()).append(" : "). 68 append(f.get(this)).append("\n"); 69 } catch (IllegalAccessException e) { 70 } 71 } 72 } 73 return sb.toString(); 74 } 75 } 76 77 /** 78 * Sample exception class to demonstrate mixin. This enum inherits the 79 * behavior of the {@link Debuggable} 80 */ 81 public static enum BuildType implements Debuggable { 82 83 BUILD(0, "-build"), 84 PLAN(0, "-plan"), 85 EXCLUDE(1, "-exclude"), 86 TOTAL(2, "-total"); 87 88 private final int compareOrder; 89 private final String pathSuffix; 90 91 private BuildType(int compareOrder, String pathSuffix) { 92 this.compareOrder = compareOrder; 93 this.pathSuffix = pathSuffix; 94 } 95 96 public int getCompareOrder() { 97 return compareOrder; 98 } 99 100 public String getPathSuffix() { 101 return pathSuffix; 102 } 103 } 104 105 /** 106 * Illustrate the behavior of the MixClass 107 * 108 * @param args command-line arguments 109 * @throws java.io.IOException internal demo error 110 */ 111 public static void main(final String[] args) throws IOException { 112 System.out.println(BuildType.BUILD.toDebugString()); 113 } 114 } 115