<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FReflection%2FInheritance</id>
		<title>Java/Reflection/Inheritance - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FReflection%2FInheritance"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Reflection/Inheritance&amp;action=history"/>
		<updated>2026-04-23T09:15:50Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Reflection/Inheritance&amp;diff=6087&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Reflection/Inheritance&amp;diff=6087&amp;oldid=prev"/>
				<updated>2010-06-01T06:01:58Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:01, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Reflection/Inheritance&amp;diff=6086&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Reflection/Inheritance&amp;diff=6086&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:43Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Class comparator: compare and sort classes and their superclasses. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
/* &lt;br /&gt;
 * JCommon : a free general purpose class library for the Java(tm) platform&lt;br /&gt;
 * &lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.&lt;br /&gt;
 * &lt;br /&gt;
 * Project Info:  http://www.jfree.org/jcommon/index.html&lt;br /&gt;
 *&lt;br /&gt;
 * This library is free software; you can redistribute it and/or modify it &lt;br /&gt;
 * under the terms of the GNU Lesser General Public License as published by &lt;br /&gt;
 * the Free Software Foundation; either version 2.1 of the License, or &lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This library is distributed in the hope that it will be useful, but &lt;br /&gt;
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY &lt;br /&gt;
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public &lt;br /&gt;
 * License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU Lesser General Public&lt;br /&gt;
 * License along with this library; if not, write to the Free Software&lt;br /&gt;
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, &lt;br /&gt;
 * USA.  &lt;br /&gt;
 *&lt;br /&gt;
 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. &lt;br /&gt;
 * in the United States and other countries.]&lt;br /&gt;
 *&lt;br /&gt;
 * --------------------&lt;br /&gt;
 * ClassComparator.java&lt;br /&gt;
 * --------------------&lt;br /&gt;
 * (C)opyright 2003-2005, by Thomas Morgner and Contributors.&lt;br /&gt;
 *&lt;br /&gt;
 * Original Author:  Thomas Morgner (taquera@sherito.org);&lt;br /&gt;
 * Contributor(s):   David Gilbert (for Object Refinery Limited);&lt;br /&gt;
 *&lt;br /&gt;
 * $Id: ClassComparator.java,v 1.3 2005/10/18 13:24:19 mungady Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Changes&lt;br /&gt;
 * -------&lt;br /&gt;
 * 02-May-2003 : Initial version&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ruparator;&lt;br /&gt;
/**&lt;br /&gt;
 * The class comparator can be used to compare and sort classes and their&lt;br /&gt;
 * superclasses. The comparator is not able to compare classes which have no&lt;br /&gt;
 * relation...&lt;br /&gt;
 * &lt;br /&gt;
 * @author Thomas Morgner&lt;br /&gt;
 */&lt;br /&gt;
public class ClassComparator implements Comparator, Serializable {&lt;br /&gt;
  /** For serialization. */&lt;br /&gt;
  private static final long serialVersionUID = -5225335361837391120L;&lt;br /&gt;
  /**&lt;br /&gt;
   * Defaultconstructor.&lt;br /&gt;
   */&lt;br /&gt;
  public ClassComparator() {&lt;br /&gt;
    super();&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Compares its two arguments for order. Returns a negative integer, zero, or&lt;br /&gt;
   * a positive integer as the first argument is less than, equal to, or greater&lt;br /&gt;
   * than the second.&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * &amp;lt;P&amp;gt;&lt;br /&gt;
   * Note: throws ClassCastException if the arguments&amp;quot; types prevent them from&lt;br /&gt;
   * being compared by this Comparator. And IllegalArgumentException if the&lt;br /&gt;
   * classes share no relation.&lt;br /&gt;
   * &lt;br /&gt;
   * The implementor must ensure that &amp;lt;tt&amp;gt;sgn(compare(x, y)) ==&lt;br /&gt;
   * -sgn(compare(y, x))&amp;lt;/tt&amp;gt;&lt;br /&gt;
   * for all &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;. (This implies that&lt;br /&gt;
   * &amp;lt;tt&amp;gt;compare(x, y)&amp;lt;/tt&amp;gt; must throw an exception if and only if&lt;br /&gt;
   * &amp;lt;tt&amp;gt;compare(y, x)&amp;lt;/tt&amp;gt; throws an exception.)&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * &lt;br /&gt;
   * The implementor must also ensure that the relation is transitive:&lt;br /&gt;
   * &amp;lt;tt&amp;gt;((compare(x, y)&amp;amp;gt;0) &amp;amp;amp;&amp;amp;amp; (compare(y, z)&amp;amp;gt;0))&amp;lt;/tt&amp;gt; implies&lt;br /&gt;
   * &amp;lt;tt&amp;gt;compare(x, z)&amp;amp;gt;0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * &lt;br /&gt;
   * Finally, the implementer must ensure that &amp;lt;tt&amp;gt;compare(x, y)==0&amp;lt;/tt&amp;gt;&lt;br /&gt;
   * implies that &amp;lt;tt&amp;gt;sgn(compare(x, z))==sgn(compare(y, z))&amp;lt;/tt&amp;gt; for all&lt;br /&gt;
   * &amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt;.&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * &lt;br /&gt;
   * It is generally the case, but &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; strictly required that&lt;br /&gt;
   * &amp;lt;tt&amp;gt;(compare(x, y)==0) == (x.equals(y))&amp;lt;/tt&amp;gt;. Generally speaking, any&lt;br /&gt;
   * comparator that violates this condition should clearly indicate this fact.&lt;br /&gt;
   * The recommended language is &amp;quot;Note: this comparator imposes orderings that&lt;br /&gt;
   * are inconsistent with equals.&amp;quot;&lt;br /&gt;
   * &lt;br /&gt;
   * @param o1&lt;br /&gt;
   *          the first object to be compared.&lt;br /&gt;
   * @param o2&lt;br /&gt;
   *          the second object to be compared.&lt;br /&gt;
   * @return a negative integer, zero, or a positive integer as the first&lt;br /&gt;
   *         argument is less than, equal to, or greater than the second.&lt;br /&gt;
   */&lt;br /&gt;
  public int compare(final Object o1, final Object o2) {&lt;br /&gt;
    final Class c1 = (Class) o1;&lt;br /&gt;
    final Class c2 = (Class) o2;&lt;br /&gt;
    if (c1.equals(o2)) {&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
    if (c1.isAssignableFrom(c2)) {&lt;br /&gt;
      return -1;&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!c2.isAssignableFrom(c2)) {&lt;br /&gt;
        throw new IllegalArgumentException(&amp;quot;The classes share no relation&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      return 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Checks, whether the given classes are comparable. This method will return&lt;br /&gt;
   * true, if one of the classes is assignable from the other class.&lt;br /&gt;
   * &lt;br /&gt;
   * @param c1&lt;br /&gt;
   *          the first class to compare&lt;br /&gt;
   * @param c2&lt;br /&gt;
   *          the second class to compare&lt;br /&gt;
   * @return true, if the classes share a direct relation, false otherwise.&lt;br /&gt;
   */&lt;br /&gt;
  public boolean isComparable(final Class c1, final Class c2) {&lt;br /&gt;
    return (c1.isAssignableFrom(c2) || c2.isAssignableFrom(c1));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Find Inherited Field ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
//&lt;br /&gt;
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $&lt;br /&gt;
//Copyright 2006 Mort Bay Consulting Pty. Ltd.&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
//Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
//you may not use this file except in compliance with the License.&lt;br /&gt;
//You may obtain a copy of the License at &lt;br /&gt;
//http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
//Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
//distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
//See the License for the specific language governing permissions and&lt;br /&gt;
//limitations under the License.&lt;br /&gt;
//&lt;br /&gt;
import java.lang.reflect.Field;&lt;br /&gt;
import java.lang.reflect.Member;&lt;br /&gt;
import java.lang.reflect.Method;&lt;br /&gt;
import java.lang.reflect.Modifier;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
public class IntrospectionUtil {&lt;br /&gt;
&lt;br /&gt;
  protected static Field findInheritedField(Package pack, Class clazz, String fieldName,&lt;br /&gt;
      Class fieldType, boolean strictType) throws NoSuchFieldException {&lt;br /&gt;
    if (clazz == null)&lt;br /&gt;
      throw new NoSuchFieldException(&amp;quot;No class&amp;quot;);&lt;br /&gt;
    if (fieldName == null)&lt;br /&gt;
      throw new NoSuchFieldException(&amp;quot;No field name&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
      Field field = clazz.getDeclaredField(fieldName);&lt;br /&gt;
      if (isInheritable(pack, field) &amp;amp;&amp;amp; isTypeCompatible(fieldType, field.getType(), strictType))&lt;br /&gt;
        return field;&lt;br /&gt;
      else&lt;br /&gt;
        return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,&lt;br /&gt;
            strictType);&lt;br /&gt;
    } catch (NoSuchFieldException e) {&lt;br /&gt;
      return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,&lt;br /&gt;
          strictType);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public static boolean isInheritable(Package pack, Member member) {&lt;br /&gt;
    if (pack == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (member == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    int modifiers = member.getModifiers();&lt;br /&gt;
    if (Modifier.isPublic(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (Modifier.isProtected(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (!Modifier.isPrivate(modifiers) &amp;amp;&amp;amp; pack.equals(member.getDeclaringClass().getPackage()))&lt;br /&gt;
      return true;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean checkParams(Class[] formalParams, Class[] actualParams, boolean strict) {&lt;br /&gt;
    if (formalParams == null &amp;amp;&amp;amp; actualParams == null)&lt;br /&gt;
      return true;&lt;br /&gt;
    if (formalParams == null &amp;amp;&amp;amp; actualParams != null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams != null &amp;amp;&amp;amp; actualParams == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams.length != actualParams.length)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams.length == 0)&lt;br /&gt;
      return true;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    if (strict) {&lt;br /&gt;
      while (j &amp;lt; formalParams.length &amp;amp;&amp;amp; formalParams[j].equals(actualParams[j]))&lt;br /&gt;
        j++;&lt;br /&gt;
    } else {&lt;br /&gt;
      while ((j &amp;lt; formalParams.length) &amp;amp;&amp;amp; (formalParams[j].isAssignableFrom(actualParams[j]))) {&lt;br /&gt;
        j++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (j != formalParams.length) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean isSameSignature(Method methodA, Method methodB) {&lt;br /&gt;
    if (methodA == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (methodB == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    List parameterTypesA = Arrays.asList(methodA.getParameterTypes());&lt;br /&gt;
    List parameterTypesB = Arrays.asList(methodB.getParameterTypes());&lt;br /&gt;
    if (methodA.getName().equals(methodB.getName()) &amp;amp;&amp;amp; parameterTypesA.containsAll(parameterTypesB))&lt;br /&gt;
      return true;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean isTypeCompatible(Class formalType, Class actualType, boolean strict) {&lt;br /&gt;
    if (formalType == null &amp;amp;&amp;amp; actualType != null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalType != null &amp;amp;&amp;amp; actualType == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalType == null &amp;amp;&amp;amp; actualType == null)&lt;br /&gt;
      return true;&lt;br /&gt;
    if (strict)&lt;br /&gt;
      return formalType.equals(actualType);&lt;br /&gt;
    else&lt;br /&gt;
      return formalType.isAssignableFrom(actualType);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Find Inherited Method ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
//&lt;br /&gt;
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $&lt;br /&gt;
//Copyright 2006 Mort Bay Consulting Pty. Ltd.&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
//Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
//you may not use this file except in compliance with the License.&lt;br /&gt;
//You may obtain a copy of the License at &lt;br /&gt;
//http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
//Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
//distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
//See the License for the specific language governing permissions and&lt;br /&gt;
//limitations under the License.&lt;br /&gt;
//&lt;br /&gt;
import java.lang.reflect.Field;&lt;br /&gt;
import java.lang.reflect.Member;&lt;br /&gt;
import java.lang.reflect.Method;&lt;br /&gt;
import java.lang.reflect.Modifier;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
public class IntrospectionUtil {&lt;br /&gt;
&lt;br /&gt;
  protected static Method findInheritedMethod(Package pack, Class clazz, String methodName,&lt;br /&gt;
      Class[] args, boolean strictArgs) throws NoSuchMethodException {&lt;br /&gt;
    if (clazz == null)&lt;br /&gt;
      throw new NoSuchMethodException(&amp;quot;No class&amp;quot;);&lt;br /&gt;
    if (methodName == null)&lt;br /&gt;
      throw new NoSuchMethodException(&amp;quot;No method name&amp;quot;);&lt;br /&gt;
    Method method = null;&lt;br /&gt;
    Method[] methods = clazz.getDeclaredMethods();&lt;br /&gt;
    for (int i = 0; i &amp;lt; methods.length &amp;amp;&amp;amp; method == null; i++) {&lt;br /&gt;
      if (methods[i].getName().equals(methodName) &amp;amp;&amp;amp; isInheritable(pack, methods[i])&lt;br /&gt;
          &amp;amp;&amp;amp; checkParams(methods[i].getParameterTypes(), args, strictArgs))&lt;br /&gt;
        method = methods[i];&lt;br /&gt;
    }&lt;br /&gt;
    if (method != null) {&lt;br /&gt;
      return method;&lt;br /&gt;
    } else&lt;br /&gt;
      return findInheritedMethod(clazz.getPackage(), clazz.getSuperclass(), methodName, args,&lt;br /&gt;
          strictArgs);&lt;br /&gt;
  }&lt;br /&gt;
  protected static Field findInheritedField(Package pack, Class clazz, String fieldName,&lt;br /&gt;
      Class fieldType, boolean strictType) throws NoSuchFieldException {&lt;br /&gt;
    if (clazz == null)&lt;br /&gt;
      throw new NoSuchFieldException(&amp;quot;No class&amp;quot;);&lt;br /&gt;
    if (fieldName == null)&lt;br /&gt;
      throw new NoSuchFieldException(&amp;quot;No field name&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
      Field field = clazz.getDeclaredField(fieldName);&lt;br /&gt;
      if (isInheritable(pack, field) &amp;amp;&amp;amp; isTypeCompatible(fieldType, field.getType(), strictType))&lt;br /&gt;
        return field;&lt;br /&gt;
      else&lt;br /&gt;
        return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,&lt;br /&gt;
            strictType);&lt;br /&gt;
    } catch (NoSuchFieldException e) {&lt;br /&gt;
      return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,&lt;br /&gt;
          strictType);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public static boolean isInheritable(Package pack, Member member) {&lt;br /&gt;
    if (pack == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (member == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    int modifiers = member.getModifiers();&lt;br /&gt;
    if (Modifier.isPublic(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (Modifier.isProtected(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (!Modifier.isPrivate(modifiers) &amp;amp;&amp;amp; pack.equals(member.getDeclaringClass().getPackage()))&lt;br /&gt;
      return true;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean checkParams(Class[] formalParams, Class[] actualParams, boolean strict) {&lt;br /&gt;
    if (formalParams == null &amp;amp;&amp;amp; actualParams == null)&lt;br /&gt;
      return true;&lt;br /&gt;
    if (formalParams == null &amp;amp;&amp;amp; actualParams != null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams != null &amp;amp;&amp;amp; actualParams == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams.length != actualParams.length)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalParams.length == 0)&lt;br /&gt;
      return true;&lt;br /&gt;
    int j = 0;&lt;br /&gt;
    if (strict) {&lt;br /&gt;
      while (j &amp;lt; formalParams.length &amp;amp;&amp;amp; formalParams[j].equals(actualParams[j]))&lt;br /&gt;
        j++;&lt;br /&gt;
    } else {&lt;br /&gt;
      while ((j &amp;lt; formalParams.length) &amp;amp;&amp;amp; (formalParams[j].isAssignableFrom(actualParams[j]))) {&lt;br /&gt;
        j++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (j != formalParams.length) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean isSameSignature(Method methodA, Method methodB) {&lt;br /&gt;
    if (methodA == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (methodB == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    List parameterTypesA = Arrays.asList(methodA.getParameterTypes());&lt;br /&gt;
    List parameterTypesB = Arrays.asList(methodB.getParameterTypes());&lt;br /&gt;
    if (methodA.getName().equals(methodB.getName()) &amp;amp;&amp;amp; parameterTypesA.containsAll(parameterTypesB))&lt;br /&gt;
      return true;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  public static boolean isTypeCompatible(Class formalType, Class actualType, boolean strict) {&lt;br /&gt;
    if (formalType == null &amp;amp;&amp;amp; actualType != null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalType != null &amp;amp;&amp;amp; actualType == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (formalType == null &amp;amp;&amp;amp; actualType == null)&lt;br /&gt;
      return true;&lt;br /&gt;
    if (strict)&lt;br /&gt;
      return formalType.equals(actualType);&lt;br /&gt;
    else&lt;br /&gt;
      return formalType.isAssignableFrom(actualType);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Is Inheritable ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
//&lt;br /&gt;
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $&lt;br /&gt;
//Copyright 2006 Mort Bay Consulting Pty. Ltd.&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
//Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
//you may not use this file except in compliance with the License.&lt;br /&gt;
//You may obtain a copy of the License at &lt;br /&gt;
//http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
//Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
//distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
//See the License for the specific language governing permissions and&lt;br /&gt;
//limitations under the License.&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import java.lang.reflect.Member;&lt;br /&gt;
import java.lang.reflect.Modifier;&lt;br /&gt;
public class Utils {&lt;br /&gt;
  public static boolean isInheritable(Package pack, Member member) {&lt;br /&gt;
    if (pack == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    if (member == null)&lt;br /&gt;
      return false;&lt;br /&gt;
    int modifiers = member.getModifiers();&lt;br /&gt;
    if (Modifier.isPublic(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (Modifier.isProtected(modifiers))&lt;br /&gt;
      return true;&lt;br /&gt;
    if (!Modifier.isPrivate(modifiers) &amp;amp;&amp;amp; pack.equals(member.getDeclaringClass().getPackage()))&lt;br /&gt;
      return true;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Return a List of super-classes for the given class. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.lang.reflect.InvocationTargetException;&lt;br /&gt;
import java.lang.reflect.Method;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Locale;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import javax.servlet.http.HttpServletResponse;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2005 Joe Walker&lt;br /&gt;
 *&lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 *&lt;br /&gt;
 *     http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 *&lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @author Joe Walker [joe at getahead dot ltd dot uk]&lt;br /&gt;
 */&lt;br /&gt;
public class Main {&lt;br /&gt;
  /**&lt;br /&gt;
   * Return a List of super-classes for the given class.&lt;br /&gt;
   * @param clazz the class to look up&lt;br /&gt;
   * @return the List of super-classes in order going up from this one&lt;br /&gt;
   */&lt;br /&gt;
  public static List&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getAllSuperclasses(Class&amp;lt;?&amp;gt; clazz)&lt;br /&gt;
  {&lt;br /&gt;
      List&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new ArrayList&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
      Class&amp;lt;?&amp;gt; superclass = clazz.getSuperclass();&lt;br /&gt;
      while (superclass != null)&lt;br /&gt;
      {&lt;br /&gt;
          classes.add(superclass);&lt;br /&gt;
          superclass = superclass.getSuperclass();&lt;br /&gt;
      }&lt;br /&gt;
      return classes;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>