1

リフレクト パッケージを使用してプライベート メソッドにアクセスしようとしています。プライベート メソッドにアクセスできますが、引数を送信する際に問題に直面しています。

私のコードは次のようになります:

Sample s = new Sample();
java.lang.reflect.Method method [] = Sample.class.getDeclaredMethods();
System.out.println("Total Number of methods in Sample class"+method.length);
for (int i=0; i<method.length;i++) {
    String methodName=method[i].getName();
    System.out.println("Method Name is "+methodName);
    if (methodName.equalsIgnoreCase("sampleTest1")) {
        method[i].setAccessible(true);
        //This is calling sampleTest1 method; it's not working
        //System.out.println(method[i].invoke(s, new String[]{"ABC"});
    } else {
        //This is calling sampleTest method and it's working
        System.out.println(method[i].invoke(s, null));
    }
}

私のサンプルクラス:

public class Sample {
    private String sampleTest(){
         return "Private Method";
    }

    private String sampleTest1(String abc){
    return "Private Method";
    }
}

sampleTest() メソッドにアクセスできますが、引数を sampleTest1() メソッドに渡す方法がわかりません。これを手伝ってもらえますか?

出力

Total Number of methods in Sample class2

Method Name is sampleTest

Exception in thread "main" java.lang.IllegalAccessException: Class com.sarma.reflection.sample.SampleTest can not access a member of class com.sarma.reflection.sample.Sample with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
    at java.lang.reflect.Method.invoke(Method.java:588)
    at com.sarma.reflection.sample.SampleTest.main(SampleTest.java:26)
4

4 に答える 4

4

nullに渡す引数をキャストする必要がありますinvoke()

 System.out.println(method[i].invoke(s, (Object)null));

それ以外の場合、引数なしで基になるメソッドを呼び出していると見なされます。null Object[]。_ nullキャストにより、コンパイラ (およびランタイム) は、オブジェクトを varargs の唯一の要素として渡していることを認識しますObject[]

編集後: ? を削除しましたsetAccessible(true)か? あなたは絡み合っていますif-else。使用する

if(methodName.equalsIgnoreCase("sampleTest1")){
    method[i].setAccessible(true);
    System.out.println(method[i].invoke(s, (Object) null));
} else{
    method[i].setAccessible(true);
    System.out.println(method[i].invoke(s, null));
}

またはmethod[i].setAccessible(true);外側に置くif-else

于 2013-09-13T15:27:38.200 に答える
0

働くIT

Sample s = new Sample();
        java.lang.reflect.Method method [] = Sample.class.getDeclaredMethods();
        System.out.println("Total Number of methods in Sample class"+method.length);
        for(int i=0; i<method.length;i++){
            String methodName=method[i].getName();
            System.out.println("Method Name is "+methodName);
            method[i].setAccessible(true);
            if(methodName.equalsIgnoreCase("sampleTest1")){
            method[i].setAccessible(true);
            //This is calling sampleTest1 method, ITs not workoing
            System.out.println(method[i].invoke(s, new String[]{"ABC"}));
            } else{
            //This is calling sampleTest method its working
            System.out.println(method[i].invoke(s, null));
            }
    }
    }

public class Sample {

    private String sampleTest(){
        return "Private Method";
    }

    private String sampleTest1(String abc){
        return "Private Method "+abc;
    }
}

出力

サンプル class2 のメソッドの総数 メソッド名は sampleTest1 プライベート メソッド ABC メソッド名は sampleTest プライベート メソッド

于 2013-09-13T15:40:54.027 に答える