Làm cách nào chúng ta có thể gọi một phương thức có tên là chuỗi khi chạy. Bất cứ ai có thể chỉ cho tôi cách làm điều đó trong Java và C.Gọi một phương thức có tên là "chuỗi" tại thời gian chạy trong Java và C
Trả lời
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
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.
"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
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
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
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()
.
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.
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.
Đâ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");
}
+1 cho phương pháp duy nhất c – stacker
Đó vẫn là một hàm và không phải là một phương thức. –
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.
- 1. phương thức gọi tại thời gian chạy
- 2. Chạy phương thức có tham số trong chuỗi trong C#
- 3. Thời gian giới hạn một phương thức trong C#
- 4. Thời gian chạy mục tiêu-C: Tên phương thức bị xáo trộn?
- 5. AS3: gọi phương thức lớp tĩnh - tên lớp và phương thức là các chuỗi
- 6. Gọi phương thức trên một lớp tĩnh cho tên kiểu và tên phương thức là các chuỗi
- 7. Làm thế nào để gọi một chuỗi để chạy vào thời gian cụ thể trong java?
- 8. Làm thế nào để gọi một phương thức về thời gian cụ thể trong java?
- 9. Tại sao các phương thức giao thức tùy chọn chưa thực hiện gây ra lỗi thời gian chạy khi phương thức đó được gọi trong obj-c?
- 10. tên gọi của phương thức chứa trong một chuỗi
- 11. Java - tại sao các lớp Hệ thống và Thời gian chạy có các phương thức giống hệt nhau?
- 12. Cách lấy tên chuỗi của một phương thức trong java?
- 13. Làm cách nào để gọi một số phương thức chặn với thời gian chờ trong Java?
- 14. Gọi phương thức ảo trong java là gì?
- 15. Xác định nếu một phương pháp Objective-C là variadic trong thời gian chạy
- 16. Làm cách nào để tìm phương pháp nào được gọi từ phương thức lớp C# - KHÔNG ở thời gian chạy
- 17. Tổng thời gian của phương thức trong Java VisualVM
- 18. Gọi phương thức C# trong một chương trình Java
- 19. là nó có thể ghi đè lên một phương pháp trong thời gian chạy?
- 20. Nhận thời gian chạy của một chuỗi java
- 21. gọi phương thức java trong mã javascript
- 22. Chạy một phương pháp trước và sau khi một phương pháp gọi trong Java
- 23. "Inlining" (loại) chức năng tại thời gian chạy trong C
- 24. Thêm chú thích Java tại thời gian chạy
- 25. Thời gian chạy Objective-C lấy danh sách các lớp và phương thức như thế nào?
- 26. Phương thức bên trong không gian tên C#
- 27. HttpSessionListener - Phương thức sessionDestroyed có được gọi là thời gian chờ của phiên không?
- 28. Thay đổi tên thông số trong C# có thay đổi phá vỡ thời gian chạy không?
- 29. Tại sao NullPointerException là một ngoại lệ thời gian chạy và RemoteException không?
- 30. C# Loại đúc tại thời gian chạy Sử dụng Reflection
Điều này không thể thực hiện được trong C. C không có phương pháp. –
Không có C++: D – Tom