web-dev-qa-db-ja.com

Javaクラスの外部からプライベートメソッドを呼び出す方法

Dummyというプライベートメソッドを持つsayHelloクラスがあります。 sayHelloの外部からDummyを呼び出したい。リフレクションで可能になるはずですが、IllegalAccessExceptionを取得します。何か案は???

27
Hamed Rajabi

invokeメソッドを使用する前に、MethodオブジェクトでsetAccessible(true)を使用します。

import Java.lang.reflect.*;
class Dummy{
    private void foo(){
        System.out.println("hello foo()");
    }
}

class Test{
    public static void main(String[] args) throws Exception {
        Dummy d = new Dummy();
        Method m = Dummy.class.getDeclaredMethod("foo");
        //m.invoke(d);// throws Java.lang.IllegalAccessException
        m.setAccessible(true);// Abracadabra 
        m.invoke(d);// now its OK
    }
}
57
Pshemo

最初にクラスを取得する必要がありますが、これはかなり簡単です。次に、getDeclaredMethodを使用して名前でメソッドを取得し、setAccessibleオブジェクトのMethodメソッドでアクセスできるようにメソッドを設定する必要があります。

    Class<?> clazz = Class.forName("test.Dummy");

    Method m = clazz.getDeclaredMethod("sayHello");

    m.setAccessible(true);

    m.invoke(new Dummy());
9
Mostafa Zeinali
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
8
Usman

次のようにJavaリフレクションを使用してプライベートメソッド(パラメーター付き)にアクセスする例:

import Java.lang.reflect.Field;
import Java.lang.reflect.InvocationTargetException;
import Java.lang.reflect.Method;
class Test
{
    private void call(int n)  //private method
    {
        System.out.println("in call()  n: "+ n);
    }
}
public class Sample
{
    public static void main(String args[]) throws ClassNotFoundException,   NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
    {
        Class c=Class.forName("Test");  //specify class name in quotes
        Object obj=c.newInstance();

        //----Accessing private Method
        Method m=c.getDeclaredMethod("call",new Class[]{int.class}); //getting method with parameters
        m.setAccessible(true);
        m.invoke(obj,7);
    }
}
5

パラメータをプライベート関数に渡したい場合は、invoke関数の2番目、3番目、...の引数として渡すことができます。以下はサンプルコードです。

Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");

あなたが見ることができる完全な例 ここ

5
Keyur