2012-07-01 21 views
24

के बाहर से एक निजी विधि कैसे कॉल करें मेरे पास Dummy कक्षा है जिसमें sayHello नामक एक निजी विधि है। मैं Dummy के बाहर से sayHello पर कॉल करना चाहता हूं। मुझे लगता है कि प्रतिबिंब के साथ यह संभव होना चाहिए लेकिन मुझे IllegalAccessException मिल गया है। कोई विचार???जावा क्लास

+13

निजी के विचार नहीं है कि आप नहीं कर सकते इसे बाहर से बुलाओ? – PriestVallon

+0

हां, प्रतिबिंब के साथ यह संभव है, लेकिन निजी बिंदु यह है कि बाहर से तरीकों को कॉल करना कठिन हो। शायद यह निजी_ नहीं हो सकता है? –

+0

@robert यह एक ही प्रोग्राम (मॉड्यूल) में है –

उत्तर

50

विधि का उपयोग करने से पहले अपने विधि ऑब्जेक्ट पर 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 
    } 
} 
+0

getMethod भी अपवाद फेंकता है !!! –

+4

क्योंकि 'getMethod' केवल सार्वजनिक विधि देता है, आपको' getDeclaredMethod' – Pshemo

+0

की आवश्यकता है, ठीक है, धन्यवाद! –

9

पहले तुम वर्ग है, जो बहुत सीधे आगे है प्राप्त होगा, तो का उपयोग कर getDeclaredMethod तो आप Method वस्तु पर setAccessible विधि द्वारा पहुँचा जा सकता के रूप में विधि निर्धारित करने की आवश्यकता नाम से विधि मिलता है।

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

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

    m.setAccessible(true); 

    m.invoke(new Dummy()); 
7
method = object.getClass().getDeclaredMethod(methodName); 
method.setAccessible(true); 
method.invoke(object); 
4

आप निजी समारोह के लिए किसी भी पैरामीटर पास करना चाहते हैं तो आप इसे दूसरा, तीसरा ..... आह्वान समारोह के तर्कों के रूप में पारित कर सकते हैं। नमूना कोड निम्नलिखित है।

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

पूर्ण उदाहरण आप देख सकते हैं (पैरामीटर के साथ) निजी विधि तक पहुँचने के रूप में निम्नानुसार जावा प्रतिबिंब का उपयोग करने का Here

4

उदाहरण:

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); 
    } 
} 
संबंधित मुद्दे