के बाहर से एक निजी विधि कैसे कॉल करें मेरे पास Dummy
कक्षा है जिसमें sayHello
नामक एक निजी विधि है। मैं Dummy
के बाहर से sayHello
पर कॉल करना चाहता हूं। मुझे लगता है कि प्रतिबिंब के साथ यह संभव होना चाहिए लेकिन मुझे IllegalAccessException
मिल गया है। कोई विचार???जावा क्लास
उत्तर
विधि का उपयोग करने से पहले अपने विधि ऑब्जेक्ट पर 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
}
}
getMethod भी अपवाद फेंकता है !!! –
क्योंकि 'getMethod' केवल सार्वजनिक विधि देता है, आपको' getDeclaredMethod' – Pshemo
की आवश्यकता है, ठीक है, धन्यवाद! –
पहले तुम वर्ग है, जो बहुत सीधे आगे है प्राप्त होगा, तो का उपयोग कर getDeclaredMethod
तो आप Method
वस्तु पर setAccessible
विधि द्वारा पहुँचा जा सकता के रूप में विधि निर्धारित करने की आवश्यकता नाम से विधि मिलता है।
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
आप निजी समारोह के लिए किसी भी पैरामीटर पास करना चाहते हैं तो आप इसे दूसरा, तीसरा ..... आह्वान समारोह के तर्कों के रूप में पारित कर सकते हैं। नमूना कोड निम्नलिखित है।
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
पूर्ण उदाहरण आप देख सकते हैं (पैरामीटर के साथ) निजी विधि तक पहुँचने के रूप में निम्नानुसार जावा प्रतिबिंब का उपयोग करने का Here
उदाहरण:
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);
}
}
निजी के विचार नहीं है कि आप नहीं कर सकते इसे बाहर से बुलाओ? – PriestVallon
हां, प्रतिबिंब के साथ यह संभव है, लेकिन निजी बिंदु यह है कि बाहर से तरीकों को कॉल करना कठिन हो। शायद यह निजी_ नहीं हो सकता है? –
@robert यह एक ही प्रोग्राम (मॉड्यूल) में है –