2

我想知道第 4 章类文件格式 - 第 4.3.3 节中指定的提供方法描述符的方法的参数数量。是否有提供此实用程序的内置功能?

4

4 回答 4

3

我不知道内置方法,但偶尔我已经实现了一个。

private static Pattern allParamsPattern = Pattern.compile("(\\(.*?\\))");
private static Pattern paramsPattern = Pattern.compile("(\\[?)(C|Z|S|I|J|F|D|(:?L[^;]+;))");


int getMethodParamCount(String methodRefType) {
    Matcher m = allParamsPattern.matcher(methodRefType);
    if (!m.find()) {
        throw new IllegalArgumentException("Method signature does not contain parameters");
    }
    String paramsDescriptor = m.group(1);
    Matcher mParam = paramsPattern.matcher(paramsDescriptor);

    int count = 0;
    while (mParam.find()) {
        count++;
    }
    return count;
}

欢迎您在此处参考完整的源代码。

于 2012-06-18T16:57:54.043 回答
0

看看这是否有效......我也在使用 ASM,这是我炮制的方法......现在已经使用了一段时间......

public static int getMethodArgumentCount(String desc) {
 int beginIndex = desc.indexOf('(') + 1;
 int endIndex = desc.lastIndexOf(')');
 String x0 = desc.substring(beginIndex, endIndex);//Extract the part related to the arguments
 String x1 = x0.replace("[", "");//remove the [ symbols for arrays to avoid confusion.
 String x2 = x1.replace(";", "; ");//add an extra space after each semicolon.
 String x3 = x2.replaceAll("L\\S+;", "L");//replace all the substrings starting with L, ending with ; and containing non whitespace characters inbetween with L.
 String x4 = x3.replace(" ", "");//remove the previously inserted spaces.
 return x4.length();//count the number of elements left.
}
于 2012-08-03T00:51:15.613 回答
-1

方法#getParameterTypes().length ?

于 2012-06-18T16:50:53.643 回答
-1

您可以使用method.getParameterTypes(). 它给你一个参数类型的数组,所以你可以知道有多少个参数。

于 2012-06-18T16:52:13.127 回答