2

Chapter 4 The class file Format - Section 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

Method#getParameterTypes().length ?

于 2012-06-18T16:50:53.643 に答える
-1

使用できますmethod.getParameterTypes()。これにより、パラメータータイプの配列が得られるため、パラメーターの数を知ることができます。

于 2012-06-18T16:52:13.127 に答える