0
    String className = "com.endpoints.EndPointImpl"; 
    String methodName = "add";
    String args = "2,3";


    try {

        Class<?> clas = Class.forName(className);
        Object obj = Class.forName(className).newInstance(); 
        java.lang.reflect.Method method = null;
        //Type[] types;

        for(java.lang.reflect.Method m :obj.getClass().getMethods())
        {
            if(m.getName().equals(methodName))
            {
                method = m;
                //types = m.getParameterTypes();
                break;
            }
        }

//java.lang.reflect.Method method = clas.getDeclaredMethod(methodName,t);


        Object[] strarr =  args.split(",");

        Object retobj = method.invoke(obj,strarr );

呼び出しに引数を渡す方法今のところ例外が生成されています理由はわかっていますが、どうすれば2つのintを渡すことができますか

add(イン、イント)

PS

ArrayList<Object> objArr = new ArrayList<Object>();

        for(java.lang.reflect.Method m :obj.getClass().getMethods())
        {
            if(m.getName().equals(methodName))
            {
                method = m;

                int index = 0;
                for(Type type :m.getGenericParameterTypes())
                {
                    if(type.getClass().equals("Integer"))
                    {
                        objArr.add(Integer.parseInt(strarr[index]));
                    }
                    else if(type.getClass().equals("Float"))
                    {
                        objArr.add(Float.parseFloat(strarr[index]));
                    }
                    index++;
                }

次に、objArrをinvokeに渡すか、より良い解決策があります。また、文字列を指定された型に変換するように汎用変換関数を作成できるかどうかも尋ねたいと思います

4

2 に答える 2

1

コードを書くときは、自分が何をすべきかを常に自問する必要があります。これに答える最善の方法は、Javadoc を読むことです。また、例外が発生した場合は、常に完全なスタック トレースを提供してください。forループ全体は必要ありません。

を使用しMethod#getDeclaredMethod(String, Class[])ます。2 つの引数を受け入れます

name - the name of the method
parameterTypes - the parameter array

メソッドに名前があり、2 つの引数addを受け入れる場合は、次のように呼び出します。int

java.lang.reflect.Method method = clas.getDeclaredMethod("add", int.class, int.class);

int.class引数は、メソッドが受け取るパラメーターの型です。

でメソッドを呼び出すことができます

method.invoke(object, 3, 3);

object はクラス宣言add(int, int)メソッドのインスタンスです。このメソッドがstaticの場合、代わりに渡すことができますnull。2 つ3の s はint、メソッドを直接呼び出しているかのように渡す引数値です。

object.add(3,3);

引数として渡す文字列を受け取っている場合は、最初にそれらをキャストする必要があります

String args = "2,3";
String[] strarr =  args.split(",");
// with no other validation
int[] values = new int[strarr.length];
for (int i = 0; i < strarr.length; i++) {
    values[i] = Integer.parseInt(strarr[i]);
}

method.invoke(object, values);

明らかに、文字列を分割して解析するときに適切な検証を実行します。

于 2013-09-02T11:07:02.927 に答える