• 根据方法名调用指定对象的方法


    package com.tszr.mango.common.utils;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ReflectionUtils {
    
        /**
         * 根据方法名调用指定对象的方法
         * 
         * @param object 要调用方法的对象
         * @param method 要调用的方法名
         * @param args   参数对象数组
         * @return
         */
        public static Object invoke(Object object, String method, Object... args) {
            Object result = null;
            Class<? extends Object> clazz = object.getClass();
            Method queryMethod = getMethod(clazz, method, args);
            if (queryMethod != null) {
                try {
                    result = queryMethod.invoke(object, args);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    throw new NoSuchMethodException(clazz.getName() + " 类中没有找到 " + method + " 方法。");
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        /**
         * 根据方法名和参数对象查找方法
         * 
         * @param clazz
         * @param name
         * @param args  参数实例数据
         * @return
         */
        public static Method getMethod(Class<? extends Object> clazz, String name, Object[] args) {
            Method queryMethod = null;
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                if (method.getName().equals(name)) {
                    Class<?>[] parameterTypes = method.getParameterTypes();
                    if (parameterTypes.length == args.length) {
                        boolean isSameMethod = true;
                        for (int i = 0; i < parameterTypes.length; i++) {
                            Object arg = args[i];
                            if (arg == null) {
                                arg = "";
                            }
                            if (!parameterTypes[i].equals(args[i].getClass())) {
                                isSameMethod = false;
                            }
                        }
                        if (isSameMethod) {
                            queryMethod = method;
                            break;
                        }
                    }
                }
            }
            return queryMethod;
        }
    }
  • 相关阅读:
    23.Linux-块设备驱动(详解)
    Linux-fdisk磁盘分区命令(16)
    Linux-mkdosfs格式化磁盘命令(15)
    22.Linux-块设备驱动之框架详细分析(详解)
    21.Linux-写USB键盘驱动(详解)
    20.Linux-USB鼠标驱动
    USB_4大描述符
    JAVA关于静态static的面试题
    eclipse自动提示功能没了的解决办法
    最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法
  • 原文地址:https://www.cnblogs.com/tszr/p/15941875.html
Copyright © 2020-2023  润新知