1

メソッド呼び出しを再作成するにはどうすればよいですか? 私が持っているのは、 によって取得されgetDeclaredMethods()、 に変換されたメソッドのリストと、 によって取得されたHashMap<String,Method>そのパラメータのクラスのリストだけですgetParameterTypes()

ユーザーから文字列を取得し、それを呼び出したいとします。

"print(3,"Hello World!",true,2.4f)"

メソッドprint(int,String,boolean,float)は getMethods() 配列の一部です。呼び出しを作成する方法を理解するのに苦労しています。これまでのところ、これは私が得たものです:

private static final Pattern functionCall = Pattern.compile(String.format("^%s\\(%s?\\)$", "(\\w+)", "(.*)"));

if( (m = functionCall.matcher(line)).find() ) {
    String function = m.group(1); // in this example = "print"
    String arguments = m.group(2); // in this example = "3,\\"Hello World!\\",true,2.4f"
    if( methods.containsKey(function) ) {
        Method method = methods.get(function);
        Class<?>[] paramsExpected = method.getParameterTypes();
        String [] paramsActual = arguments.split(",");
        if( paramsExpected.length != paramsActual.length ) {
            throw new IllegalArgumentException(function + ": bad number of arguments");
        }
        for( Class<?> param: paramsExpected) {
            ???????
        }
        method.invoke(context, ??????);

完全に明確にするために、ユーザーが入力する文字列を事前に知りません。使用可能なメソッドとそのパラメーターに対してチェックする必要があり、見つかった場合は、によって提供されるパラメーターで呼び出す必要があります。ユーザー。

4

1 に答える 1

2

これはあなたがする必要があることです。1 つのオプションは、BeanUtilsのConverterUtils.convertメソッドを使用して、文字列を特定の型のオブジェクトに変換することです。これは、組み込み型で機能します。

    Object[] args = new Object[paramsExpected.length];
    int i = 0;  
    for( Class<?> param: paramsExpected) {
        args[i] = convertStringToType(paramsActual[i], param);
        i  = i +1;
    }
    method.invoke(context, args);

    Object convertStringToType(String input, Class<?> type) {
      return ConverterUtils.convert(input,type);
    }
于 2013-05-17T08:04:30.210 に答える