Dummy
というプライベートメソッドを持つクラスがありますsayHello
。sayHello
外から電話したいDummy
。リフレクションで可能だと思いますが、IllegalAccessException
. 何か案は???
質問する
66921 次
5 に答える
62
setAccessible(true)
メソッドを使用する前に、Methodオブジェクトで使用しますinvoke
。
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
}
}
于 2012-07-01T13:16:13.570 に答える
9
まず、クラスを取得する必要があります。これは非常に簡単です。次に、を使用して名前でメソッドを取得します。次に、オブジェクトのメソッドgetDeclaredMethod
からアクセスできるようにメソッドを設定する必要があります。setAccessible
Method
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
于 2012-07-01T13:17:43.977 に答える
8
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
于 2012-07-01T13:19:53.280 に答える
7
任意のパラメーターをプライベート関数に渡したい場合は、呼び出し関数の 2 番目、3 番目の ..... 引数として渡すことができます。以下はサンプルコードです。
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
ここで見ることができる完全な例
于 2014-01-23T14:00:09.580 に答える
6
次のように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);
}
}
于 2016-06-09T13:14:07.863 に答える