Find method : Method « Reflection « Java






Find method

      
//
//$Id: IntrospectionUtil.java 1540 2007-01-19 12:24:10Z janb $
//Copyright 2006 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at 
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
//

import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

public class IntrospectionUtil {
  public static Method findMethod(Class clazz, String methodName, Class[] args,
      boolean checkInheritance, boolean strictArgs) throws NoSuchMethodException {
    if (clazz == null)
      throw new NoSuchMethodException("No class");
    if (methodName == null || methodName.trim().equals(""))
      throw new NoSuchMethodException("No method name");

    Method method = null;
    Method[] methods = clazz.getDeclaredMethods();
    for (int i = 0; i < methods.length && method == null; i++) {
      if (methods[i].getName().equals(methodName)
          && checkParams(methods[i].getParameterTypes(), (args == null ? new Class[] {} : args),
              strictArgs)) {
        method = methods[i];
      }

    }
    if (method != null) {
      return method;
    } else if (checkInheritance)
      return findInheritedMethod(clazz.getPackage(), clazz.getSuperclass(), methodName, args,
          strictArgs);
    else
      throw new NoSuchMethodException("No such method " + methodName + " on class "
          + clazz.getName());

  }

  public static Field findField(Class clazz, String targetName, Class targetType,
      boolean checkInheritance, boolean strictType) throws NoSuchFieldException {
    if (clazz == null)
      throw new NoSuchFieldException("No class");
    if (targetName == null)
      throw new NoSuchFieldException("No field name");

    try {
      Field field = clazz.getDeclaredField(targetName);
      if (strictType) {
        if (field.getType().equals(targetType))
          return field;
      } else {
        if (field.getType().isAssignableFrom(targetType))
          return field;
      }
      if (checkInheritance) {
        return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), targetName,
            targetType, strictType);
      } else
        throw new NoSuchFieldException("No field with name " + targetName + " in class "
            + clazz.getName() + " of type " + targetType);
    } catch (NoSuchFieldException e) {
      return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), targetName, targetType,
          strictType);
    }
  }

  public static boolean isInheritable(Package pack, Member member) {
    if (pack == null)
      return false;
    if (member == null)
      return false;

    int modifiers = member.getModifiers();
    if (Modifier.isPublic(modifiers))
      return true;
    if (Modifier.isProtected(modifiers))
      return true;
    if (!Modifier.isPrivate(modifiers) && pack.equals(member.getDeclaringClass().getPackage()))
      return true;

    return false;
  }

  public static boolean checkParams(Class[] formalParams, Class[] actualParams, boolean strict) {
    if (formalParams == null && actualParams == null)
      return true;
    if (formalParams == null && actualParams != null)
      return false;
    if (formalParams != null && actualParams == null)
      return false;

    if (formalParams.length != actualParams.length)
      return false;

    if (formalParams.length == 0)
      return true;

    int j = 0;
    if (strict) {
      while (j < formalParams.length && formalParams[j].equals(actualParams[j]))
        j++;
    } else {
      while ((j < formalParams.length) && (formalParams[j].isAssignableFrom(actualParams[j]))) {
        j++;
      }
    }

    if (j != formalParams.length) {
      return false;
    }

    return true;
  }

  public static boolean isSameSignature(Method methodA, Method methodB) {
    if (methodA == null)
      return false;
    if (methodB == null)
      return false;

    List parameterTypesA = Arrays.asList(methodA.getParameterTypes());
    List parameterTypesB = Arrays.asList(methodB.getParameterTypes());

    if (methodA.getName().equals(methodB.getName()) && parameterTypesA.containsAll(parameterTypesB))
      return true;

    return false;
  }

  public static boolean isTypeCompatible(Class formalType, Class actualType, boolean strict) {
    if (formalType == null && actualType != null)
      return false;
    if (formalType != null && actualType == null)
      return false;
    if (formalType == null && actualType == null)
      return true;

    if (strict)
      return formalType.equals(actualType);
    else
      return formalType.isAssignableFrom(actualType);
  }

  public static boolean containsSameMethodSignature(Method method, Class c, boolean checkPackage) {
    if (checkPackage) {
      if (!c.getPackage().equals(method.getDeclaringClass().getPackage()))
        return false;
    }

    boolean samesig = false;
    Method[] methods = c.getDeclaredMethods();
    for (int i = 0; i < methods.length && !samesig; i++) {
      if (IntrospectionUtil.isSameSignature(method, methods[i]))
        samesig = true;
    }
    return samesig;
  }

  public static boolean containsSameFieldName(Field field, Class c, boolean checkPackage) {
    if (checkPackage) {
      if (!c.getPackage().equals(field.getDeclaringClass().getPackage()))
        return false;
    }

    boolean sameName = false;
    Field[] fields = c.getDeclaredFields();
    for (int i = 0; i < fields.length && !sameName; i++) {
      if (fields[i].getName().equals(field.getName()))
        sameName = true;
    }
    return sameName;
  }

  protected static Method findInheritedMethod(Package pack, Class clazz, String methodName,
      Class[] args, boolean strictArgs) throws NoSuchMethodException {
    if (clazz == null)
      throw new NoSuchMethodException("No class");
    if (methodName == null)
      throw new NoSuchMethodException("No method name");

    Method method = null;
    Method[] methods = clazz.getDeclaredMethods();
    for (int i = 0; i < methods.length && method == null; i++) {
      if (methods[i].getName().equals(methodName) && isInheritable(pack, methods[i])
          && checkParams(methods[i].getParameterTypes(), args, strictArgs))
        method = methods[i];
    }
    if (method != null) {
      return method;
    } else
      return findInheritedMethod(clazz.getPackage(), clazz.getSuperclass(), methodName, args,
          strictArgs);
  }

  protected static Field findInheritedField(Package pack, Class clazz, String fieldName,
      Class fieldType, boolean strictType) throws NoSuchFieldException {
    if (clazz == null)
      throw new NoSuchFieldException("No class");
    if (fieldName == null)
      throw new NoSuchFieldException("No field name");
    try {
      Field field = clazz.getDeclaredField(fieldName);
      if (isInheritable(pack, field) && isTypeCompatible(fieldType, field.getType(), strictType))
        return field;
      else
        return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,
            strictType);
    } catch (NoSuchFieldException e) {
      return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), fieldName, fieldType,
          strictType);
    }
  }

}

   
    
    
    
    
    
  








Related examples in the same category

1.Method Reflection
2.Load a method on the fly
3.Demonstrates how to get specific method information
4.Class Reflection: show methodsClass Reflection: show methods
5.Object Reflection: invoke methodsObject Reflection: invoke methods
6.To get the calling method
7.Get the class name in a static method
8.Call a method dynamically (Reflection)
9.Call a class method with 2 arguments
10.Using reflection to show all the methods of a class,
11.Invoke method through Java Reflection APIInvoke method through Java Reflection API
12.Get a given method, and invoke it
13.Show loading a class and finding and calling its Main methodShow loading a class and finding and calling its Main method
14.Demonstrates dynamic usage of methods
15.Demonstration of various method invocation issues
16.An invocation handler that counts the number of calls for all methods in the target class.
17.Method modifiers: isSynthetic(), m.isVarArgs(), m.isBridge()
18.Call private method
19.Get the methods of a class object
20.Invoke a method using Method class
21.The next example calls a class method with 2 arguments:
22.Getting the Methods of a Class Object: By obtaining a list of all declared methods
23.Getting the Methods of a Class Object: By obtaining a list of all public methods, both declared and inherited.
24.Getting the Methods of a Class Object: By obtaining a particular Method object.
25.Get the current method name
26.Get the current method name With JDK1.5
27.Get all declared methods from a class
28.Make methods that have unspecified number of parameters:pass an array of Objects
29.Get all methods including the inherited method. Using the getMethods(), we can only access public methods.
30.Fetches all methods of all access types from the supplied class and super classes
31.Find a Method on the supplied class with the supplied name and no parameters
32.Find a Method on the supplied class with the supplied name and parameter types
33.Checks whether the specified class contains a method matching the specified name.
34.Call a member function to get the value
35.Call a method of an object
36.Call a static method of a class with reflection
37.Returns method with the specified name
38.Invokes a method, masking with a runtime exception all the exceptions.
39.Sorts methods according to their name, number of parameters, and parameter types.
40.This program shows how to invoke methods through reflection
41.Adds all methods (from Class.getMethodCalls) to the list
42.Find method 2
43.Find Declared Methods
44.Get Static Method
45.Search Method
46.Convert method to property name.
47.Get all methods of a class.
48.Method signature
49.Gets a String array of all method calls for the given class
50.Convert the Method to a Java Code String (arguments are replaced by the simple types)