2010-05-21 14 views
5

में रनटाइम पर "स्ट्रिंग" नामक एक विधि को कॉल करना हम एक विधि को कैसे कॉल कर सकते हैं जिसका नाम स्ट्रिंग रनटाइम पर है। क्या कोई मुझे दिखा सकता है कि जावा और सीजावा और सी

+0

सी सी में नहीं किया जा सकता है विधियों में नहीं है। –

+0

न तो सी ++: डी – Tom

उत्तर

26

जावा में यह प्रतिबिंब एपीआई के माध्यम से किया जा सकता है।

Class.getMethod(String methodName, Class... parameterTypes) पर एक नज़र डालें।

(एक तर्क के साथ एक गैर स्थैतिक विधि के) एक पूरा उदाहरण होगा:

import java.lang.reflect.*; 
public class Test { 

    public String methodName(int i) { 
     return "Hello World: " + i; 
    } 

    public static void main(String... args) throws Exception { 
     Test t = new Test(); 
     Method m = Test.class.getMethod("methodName", int.class); 
     String returnVal = (String) m.invoke(t, 5); 
     System.out.println(returnVal); 
    } 
} 

कौन सा आउटपुट:

Hello World: 5

2

जावा में:

तो क्लास ए एक विधि "स्ट्रिंग()" है, फिर आप इसे कॉल करते हैं:

A a = new A(); 
a.string(); 

सी में विधियां नहीं हैं और आप उन्हें कॉल नहीं कर सकते हैं। आप सी ++ के बारे में सोच रहे हैं जो अनिवार्य रूप से बिल्कुल एक ही वाक्यविन्यास है।

+0

"रनटाइम में" सुझाव देता है कि विधि का नाम संकलन समय में निर्धारित नहीं है। – aioobe

+0

मैं किसी भी तरह ऐसा नहीं सोचता कि ओपी का मतलब क्या है। मैं सवाल को डायनामिक फ़ंक्शन रिज़ॉल्यूशन के रूप में समझता हूं - इस प्रकार, जावा में प्रतिबिंब, और काफी नहीं, बंद सी – Amadan

+0

में फ़ंक्शन पॉइंटर लुकअप तालिका शायद नहीं। लेकिन मैंने सोचा कि मैं उस प्रश्न के सटीक उत्तर को जोड़ूंगा जो उसने पूछा था, अगर वह वही था जो वह चाहता था। – DJClayworth

3

जावा में आप reflection का प्रयोग करेंगे:

Class<?> classContainingTheMethod = ...; // populate this! 
Method stringMethod = classContainingTheMethod.getMethod("string"); 
Object returnValue = stringMethod.invoke(null); 

यह एक बहुत ही सरल मामले कि मानती है कि आपके विधि स्थिर है और कोई पैरामीटर लेता है। गैर स्थैतिक तरीकों के लिए, आप इस विधि को लागू करने के लिए उदाहरण में पास करेंगे, और किसी भी मामले में आप invoke() विधि कॉल पर किसी आवश्यक पैरामीटर में पास कर सकते हैं।

2

जावा में, आपको Java Reflection API का उपयोग करने के लिए Method ऑब्जेक्ट का संदर्भ प्राप्त करने के लिए अपनी विधि का प्रतिनिधित्व करना होगा, जिसे आप निष्पादित कर सकते हैं।

2

सी (या सी ++) में वास्तविक प्रतिबिंब संभव नहीं है क्योंकि यह एक संकलित भाषा है।

सबसे अधिक इस्तेमाल किया जाने वाला एक सहयोगी कंटेनर (एक नक्शा) है जो एक फ़ंक्शन नाम (एक स्ट्रिंग के रूप में) को फ़ंक्शन पॉइंटर से लिंक कर सकता है। आपको अपने इच्छित मूल्य के साथ प्रोग्राम में मानचित्र भरना होगा। यह स्वचालित रूप से नहीं किया जा सकता है।

आप बस एक ऐसा फ़ंक्शन भी ले सकते हैं जो पैरामीटर के रूप में स्ट्रिंग लेता है और फिर हाथ से बने आईएफएस के साथ कॉल करने के लिए सही फ़ंक्शन चुना जाता है।

3

यहां एक बेस सी उदाहरण है, मुझे उम्मीद है कि यह आपकी मदद करेगा।

typedef void (*fun)(void); 

static void hello() 
{ 
    puts("hello world"); 
} 

static void string() 
{ 
    puts("string"); 
} 

static void unknown() 
{ 
    puts("unknown command"); 
} 

struct cmd 
{ 
    char* name; 
    void (*fun) (struct cmd* c); 
}; 

static struct cmd commands[] = { 
    { "hello", hello }, 
    { "string", string }, 
    { 0, unknown } 
}; 


static void execute(const char* cmdname) 
{ 
    struct cmd *c = commands; 

    while (c->name && strcmp (cmdname, c->name)) 
    c++; 
    (*c->fun) (c); 
} 

int main() 
{ 
    execute("hello"); 
    execute("string"); 
    execute("qwerty"); 
} 
+0

+1 केवल सी दृष्टिकोण – stacker

+0

के लिए +1 यह अभी भी एक कार्य है और एक विधि नहीं है। –

0

मुझे पूरा यकीन है कि आप अपने सभी कार्यों को साझा लाइब्रेरी में डाल सकते हैं और उन्हें dlopen + dlsym से लोड कर सकते हैं।

संबंधित मुद्दे