2010-05-21 63 views

Trả lời

26

Trong java, nó có thể được thực hiện thông qua api phản chiếu.

Hãy xem Class.getMethod(String methodName, Class... parameterTypes).

Một ví dụ đầy đủ (của một phương pháp không tĩnh với một cuộc tranh cãi) sẽ là:

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); 
    } 
} 

Những kết quả đầu ra:

Hello World: 5

2

Trong Java:

Nếu lớp Một có một phương thức "string()", sau đó bạn gọi nó bằng cách:

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

C không có phương pháp và bạn không thể gọi chúng. Bạn có thể nghĩ về C++ về cơ bản có cú pháp chính xác giống nhau.

+0

"trong thời gian chạy" gợi ý rằng tên của phương pháp không được xác định trong thời gian biên dịch. – aioobe

+0

Tôi bằng cách nào đó không nghĩ đó là ý nghĩa của OP. Tôi hiểu câu hỏi là độ phân giải chức năng động - do đó, phản ánh trong Java, và không hoàn toàn nhưng gần, bảng tra cứu con trỏ hàm trong C. – Amadan

+0

Có lẽ là không. Nhưng tôi nghĩ tôi sẽ thêm câu trả lời chính xác cho câu hỏi anh ta hỏi, trong trường hợp đó là điều anh ta muốn. – DJClayworth

3

Trong Java bạn sẽ sử dụng reflection:

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

Đây là một trường hợp rất đơn giản, cho rằng phương pháp của bạn là tĩnh và có không có thông số. Đối với các phương thức không tĩnh, bạn sẽ vượt qua trong cá thể để gọi phương thức, và trong bất kỳ trường hợp nào, bạn có thể truyền vào bất kỳ tham số bắt buộc nào cho cuộc gọi phương thức invoke().

2

Trong Java, bạn sẽ phải sử dụng Java Reflection API để tham chiếu đến đối tượng Method đại diện cho phương pháp của bạn, sau đó bạn có thể thực thi.

2

Trong phản chiếu thực C (hoặc C++) là không thể vì nó là một ngôn ngữ được biên dịch.

Được sử dụng nhiều nhất là có vùng chứa liên kết (bản đồ) có thể liên kết tên hàm (dưới dạng chuỗi) với con trỏ hàm. Bạn phải điền vào bản đồ trong chương trình với giá trị bạn muốn. Điều này không thể được thực hiện tự động.

Bạn cũng có thể chỉ cần có một hàm lấy chuỗi làm tham số và sau đó chọn đúng chức năng để gọi bằng ifs được tạo thủ công.

3

Đây là ví dụ C cơ bản, tôi hy vọng nó sẽ giúp bạn.

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 cho phương pháp duy nhất c – stacker

+0

Đó vẫn là một hàm và không phải là một phương thức. –

0

Tôi khá chắc chắn bạn có thể đặt tất cả các chức năng của mình vào thư viện được chia sẻ và tải chúng với dlopen + dlsym.

Các vấn đề liên quan