Java Reflection Method Get from Object getMethod(Object target, String signature)

Here you can find the source of getMethod(Object target, String signature)

Description

get Method

License

Open Source License

Return

the declared with given signature, may be private.

Declaration

public static Method getMethod(Object target, String signature) 

Method Source Code


//package com.java2s;
/*//  www .j  a v  a2s. c om
 * Copyright (c) 2012, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * 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 org.eclipse.core.runtime.Assert;

import java.lang.reflect.Method;

public class Main {
    /**
     * @return the declared {@link Method} with given signature, may be private.
     */
    public static Method getMethod(Object target, String signature) {
        Assert.isNotNull(target);
        Assert.isNotNull(signature);
        Class<?> targetClass = getTargetClass(target);
        while (targetClass != null) {
            for (Method method : targetClass.getDeclaredMethods()) {
                if (getMethodSignature(method).equals(signature)) {
                    method.setAccessible(true);
                    return method;
                }
            }
            targetClass = targetClass.getSuperclass();
        }
        return null;
    }

    /**
     * @return the {@link Class} or the given "target" - "target" itself if it is {@link Class} or its
     *         {@link Class} if just some object.
     */
    private static Class<?> getTargetClass(Object target) {
        if (target instanceof Class) {
            return (Class<?>) target;
        }
        return target.getClass();
    }

    /**
     * @return the signature of the given {@link Method}, not JVM signature however, just some
     *         reasonable signature to write manually.
     */
    private static String getMethodSignature(Method method) {
        StringBuilder sb = new StringBuilder();
        sb.append(method.getName());
        sb.append('(');
        boolean firstParameter = true;
        for (Class<?> parameterType : method.getParameterTypes()) {
            if (!firstParameter) {
                sb.append(',');
            }
            firstParameter = false;
            sb.append(getClassName(parameterType));
        }
        sb.append(')');
        return sb.toString();
    }

    /**
     * @return the name of the {@link Class} for signature.
     */
    public static String getClassName(Class<?> clazz) {
        return clazz.getName();
    }
}

Related

  1. getMethod(Object object, String name, Object... params)
  2. getMethod(Object oo, String mname)
  3. getMethod(Object pojo, String methodName, Class[] params)
  4. getMethod(Object target, String methodName)
  5. getMethod(Object target, String methodName, Class... parameterTypes)
  6. getMethod(String methodName, Object instance)
  7. getMethodAnnotatedWith(final Class type, final Class annotation, String fieldName, Object fieldValue)
  8. getMethodByName(Object target, String methodName)
  9. getMethodConfigByAnnotaton(Object instance, Class declaringClass, Class annotationType, Class type)