/* =========================================================== * TradeManager : a application to trade strategies for the Java(tm) platform * =========================================================== * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Project Info: org.trade * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Oracle, Inc. * in the United States and other countries.] * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Original Author: Simon Allen; * Contributor(s): -; * * Changes * ------- * */ package org.trade.ui.base; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * This class performs some useful reflection type functionality when the target * method is overloaded by other methods or when method signatures are * reflective of a class hierarchy. * * @author Wayne Milsted * @version $Id: Parametric.java,v 1.1 2001/10/18 01:32:15 simon Exp $ */ public class Parametric { /** * Constructor for Parametric. * * @param aClassToReflect * Class<?> */ public Parametric(Class<?> aClassToReflect) { super(); m_class = aClassToReflect; } /** * Method getClassToReflect. * * @return Class<?> */ public Class<?> getClassToReflect() { return m_class; } /** * Method findMethod. * * @param methodName * String * @param parameters * Class<?>[] * @return Method */ public Method findMethod(String methodName, Class<?>[] parameters) { Method theReturn = null; Class<?> currentClass = m_class; while (true) { try { Method[] methods = currentClass.getDeclaredMethods(); for (Method method : methods) { int modifiers = method.getModifiers(); if (method.getName().equals(methodName) && Modifier.isPublic(modifiers)) { if (isTargetSignature(method, parameters)) { theReturn = method; break; } } } // end for loop } // end try block catch (Throwable t) { break; } currentClass = currentClass.getSuperclass(); if (null == currentClass) { break; // we've reached beyond Object } } // end while loop return theReturn; } /** * Method findField. * * @param fieldName * String * @return Field */ public Field findField(String fieldName) { Field theReturn = null; Class<?> currentClass = m_class; while (true) { try { Field[] fields = currentClass.getDeclaredFields(); for (Field field : fields) { int modifiers = field.getModifiers(); if (field.getName().equals(fieldName) && Modifier.isPublic(modifiers)) { theReturn = field; break; } } // end for loop } // end try block catch (Throwable t) { break; } currentClass = currentClass.getSuperclass(); if (null == currentClass) { break; // we've reached beyond Object } } // end while loop return theReturn; } /** * Method isTargetSignature. * * @param aMethod * Method * @param parameters * Class<?>[] * @return boolean */ private boolean isTargetSignature(Method aMethod, Class<?>[] parameters) { boolean theReturn = false; Class<?>[] thisMethodsParameters = aMethod.getParameterTypes(); // no need to check further if the number of parameters // are unequal if (thisMethodsParameters.length == parameters.length) { for (int i = 0; i < parameters.length; i++) { Class<?> thisParm = thisMethodsParameters[i]; Class<?> target = parameters[i]; theReturn = thisParm.equals(target) || thisParm.isAssignableFrom(target); if (!theReturn) { break; } } } return theReturn; } private Class<?> m_class = null; }