package game.objects; import java.lang.*; import java.lang.reflect.*; import java.util.Arrays; import java.util.Date; import jdk.nashorn.internal.runtime.Version; /** * Why have your own initializer? Simple. This makes initialization of objects * much more manageable than just giving control to the JVM. Should the graphics * or actors be loaded first? You decide! Recommended for use when starting the * game. * * @author Link_The_Programmer * @version 0.9.5 * @ */ @SuppressWarnings("LocalVariableHidesMemberVariable") public final class Initializer extends ClassLoader { private static transient volatile Exception e; private transient Object[] f; private static transient int numOfObjects = 0; private static transient Date date = new Date(); private Initializer() { } //[Constructor] public Initializer(Object obj) throws ClassNotFoundException, NoSuchFieldException { initialize(obj); System.out.println(obj + " initialized."); } public Initializer(Object[] obj) throws ClassNotFoundException, NoSuchFieldException, Exception { System.out.println("[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Initializing objects..."); initialize(obj); System.out.println("[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Objects initialized. Total quantity: " + numOfObjects); System.out.println(); for (Object object : obj) { if (object == null) { System.err.println(e.getStackTrace()[e.getStackTrace().length - 1].getClassName() + ".Field" + Arrays.toString(e.getStackTrace()[e.getStackTrace().length - 1].getClassName().getBytes()) + "] not initialized; value = " + e.getLocalizedMessage() + " at line: " + e.getStackTrace()[e.getStackTrace().length - 1].getLineNumber()); } } } //[/Constructor] /** * Initializes an object. you must put the fully qualified name as the * parameter (complete package location with name) in order to work. * * @param obj * @return * @throws ClassNotFoundException */ @SuppressWarnings("BoxingBoxedValue") private synchronized Object initialize(Object obj) throws NoSuchFieldException, ClassNotFoundException { if (obj instanceof Integer) { return new Integer(Integer.valueOf((Integer) obj)); } else if (obj instanceof Byte) { return new Byte(Byte.valueOf((Byte) obj)); } else if (obj instanceof Character) { return new Character(Character.valueOf((Character) obj)); } else if (obj instanceof String) { return String.valueOf(obj); } else if (obj instanceof Boolean) { return Boolean.valueOf((Boolean) obj); } else if (obj instanceof Class) { return obj.getClass(); } else if (obj instanceof Double) { return new Double((Double) obj); } else if (obj instanceof Float) { return new Float(Float.valueOf((Float) obj)); } else if (obj instanceof Long) { return new Long(Long.valueOf((Long) obj)); } else if (obj instanceof Short) { return new Short(Short.valueOf((Short) obj)); } else if (obj instanceof Thread) { return new Thread((Thread) obj); } else { return obj; } } /** * Initializes an array of objects. This does not actually initialize the * objects, it just checks them. Say you have an Image, perhaps the value * was null! * * * @param obj * @return * @throws ClassNotFoundException * @throws NoSuchFieldException * @throws Exception */ private synchronized void initialize(Object[] obj) throws ClassNotFoundException, NoSuchFieldException, Exception { if (obj != null) { try { throw new Exception(); } catch (Exception e) { for (Object object : obj) { initialize(object); Initializer.e = e; if (object instanceof Field || object instanceof Class) { if (object instanceof Field) { Field.setAccessible((AccessibleObject[]) obj, true); System.out.println(object + " initialized. value: " + getValue(object)); numOfObjects += 1; Field.setAccessible((AccessibleObject[]) obj, false); } else { System.out.println(((Class) object).getCanonicalName() + " initialized."); numOfObjects += 1; } } else { System.out.println(getContainingClass(object) + ".Field" + Arrays.toString(e.getStackTrace()[getStackSize() - 1].getClassName().getBytes()) + "] initialized. value: " + "(" + getInstanceAsString(object) + ")" + object); numOfObjects += 1; } } } } } @SuppressWarnings("BoxingBoxedValue") public static Object getValue(Object obj) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException { Field f = (Field) obj; if (f.getType().isPrimitive() || f.getType().isSynthetic()) { return f.get(f); } else if (f.getType() == String.class || f.getType() == Character.class) { return f.get(f); } else if (f.getType() == Boolean.class) { return f.get(f); } else { return f.getType().getCanonicalName(); } } public static Object[] getClasses(Class clss) { return clss.getDeclaredClasses(); } public static Object[] getFields(Class clss) { return clss.getDeclaredFields(); } public static int getNumOfObjects() { return numOfObjects; } @SuppressWarnings("BoxingBoxedValue") public static int getStackSize() { if (e != null) { return e.getStackTrace().length; } return 0; } /** * Gets the StackTrace context of this object. * * @return Exception e which is the Exception that has the stack being used. */ public static Exception getStackContext() { return Initializer.e; } public static Object getInstance(Object obj) throws NoSuchFieldException { return ((Class) obj).getTypeName(); } public static String getInstanceAsString(Object obj) { if (obj == null) { return "Object"; } else if (obj instanceof Integer) { return "Integer"; } else if (obj instanceof Byte) { return "Byte"; } else if (obj instanceof Character) { return "Character"; } else if (obj instanceof String) { return "String"; } else if (obj instanceof Boolean) { return "Boolean"; } else if (obj instanceof Class) { return "Class"; } else if (obj instanceof Double) { return "Double"; } else if (obj instanceof Float) { return "Float"; } else if (obj instanceof Long) { return "Long"; } else if (obj instanceof Short) { return "Short"; } else if (obj instanceof Thread) { return "Thread"; } else if (obj instanceof Enum) { return "Enum"; } else if (obj instanceof Object[]) { return "Object[]"; } else { return "Unknown"; } } public static Class getContainingClass(Object obj) { return Initializer.e.getStackTrace()[getStackSize() - 1].getClassName().getClass().getDeclaringClass(); } public static Version getVersion(){ return e.getStackTrace()[getStackSize() - 1].getClassName().getClass().class.getAnnotation(Version.class); } private Integer[] parseFieldIntValues(Class clss) { this.f = clss.getDeclaredFields(); Integer[] values = {(Integer) f[0]}; return values; } }