java - 比较方法参数类型,过滤具有特定签名的类的方法

标签 java reflection methods filter

想要对与签名匹配的方法进行分组。因此,给定 Class clz,返回类型 class R 和一个列表(如果参数类型为 Class []argsCLasses),则用 clz 中的匹配方法填充映射。我将把这些方法存储在一个映射中,并且该映射将使用用户提供的参数调用该方法。

有了这个映射,我不需要一个大的 case 语句,只需通过匹配名称获取方法,然后调用它。

示例,

class Foo {

    public void method(String a, String b, int i) {

    }

    public void method2(String a2, String b2, int i2) {

    }

    public void method3(String a2, int i2) {

    }

    public void method4(String a2, String b2, int i2) {

    }

}

如果我想匹配[String, String, Integer],方法1、2和4都是匹配的。

我有什么:

导入org.apache.log4j.Logger;

公共(public)类 ReflectUtils { 私有(private)静态最终 Logger logger = Logger.getLogger(ReflectUtils.class);

public static String fillMethods(Class clz, Class[] argsCLasses, Map<String, Method> methods) {
    String rtn = null;
    synchronized (methods) {

        synchronized (clz) {
            try {
                Method[] methodsAvail = clz.getMethods();
                boolean match = false;
                for (Method mtd : methodsAvail) {
                    Class rtnM = mtd.getReturnType();
                    // if (rtnM.isAssignableFrom( rtnType)) {
                    // continue;
                    // }
                    Class[] args = mtd.getParameterTypes();
                    if (argsCLasses.length != args.length) {
                        continue;
                    }
                    match = true;
                    for (int i = 0; i < argsCLasses.length; i++) {
                        if (args[i] != argsCLasses[i]) {
                            match = false;
                        }
                    }
                    if(match){
                        methods.put(mtd.getName(), mtd);
                    }
                }
            } catch (Throwable e) {
                rtn = "ERROR :" + e;
                logger.error("Err fill methods :" + e, e);

            }
        }
    }
    return rtn;
}

public static void main(String[] args) {
    Class[] argsCLasses = new Class[] { String.class, String.class, Integer.class };
    Map<String, Method> methods = new HashMap<String, Method>();
    // Class clz, Class[] argsCLasses, Map<String, Method> methods
    fillMethods(Foo.class, argsCLasses, methods);
    System.out.println(methods);
    System.out.println();
    System.out.println(methods.keySet());
}

}

这已经有什么了吗?

在内循环中

if (args[i] != argsCLasses[i]) 

我应该使用 isAssignableFrom 吗?或者其他东西来看看它是否匹配的参数?还有什么可以比较来看看方法是否符合标准?

最佳答案

您可以使用 isAssignableFrom 来匹配参数。您可能还需要将基元类型与其包装器相匹配。我的实用程序库中的示例:

private static boolean _matches(Class inputParam, Class<?> declaredArgumentParam) {
    boolean matches = true;
    if (!declaredParam.isAssignableFrom(inputParam)) {
        if(
            (inputParam.isPrimitive() && Primitives.wrap(inputParam) == declaredArgumentParam) ||
            (declaredArgumentParam.isPrimitive() && Primitives.wrap(declaredArgumentParam) == inputParam)
            ){
        }else{
            matches = false;
        }
    }
    return matches;
}

完整源代码位于 github:HavingMethodSignature.java .

关于java - 比较方法参数类型,过滤具有特定签名的类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20524215/

相关文章:

java - 如何在 Java 中将公历转换为 Unix 时间?

methods - 如何在 Rust 中使用方法作为函数指针

java - 具有多个输入java的方法

java - Android Studio 中的 Maven 存储库是什么?

java - LinkedHashMap<String,Object>.clone();

c# - 如何使用 propertyInfo 获取列表类型属性的值

java - Java 中的算术运算

java - 将函数参数列表的字符串表示形式转换为实际参数,以进行反射调用

java - 使用反射检索对象的数据类型

PHP - 类中的 catchall 方法