2012-01-28 25 views
10

Nếugọi phương thức tĩnh cho một đối tượng lớp trong java

class MyClass { 
    public static void main(String[] str) { 
     System.out.println("hello world"); 
    } 
} 

// in some other file and method 
Class klass = Class.forName("MyClass"); 

Làm thế nào tôi có thể gọi MyClass.main? Tôi không có chuỗi "MyClass" tại thời gian biên dịch, vì vậy tôi không thể gọi đơn giản là MyClass.main(String[]{}).

+0

Phản ánh và tải lớp có thể thực hiện việc này. Bạn có thể cho chúng tôi biết động cơ đằng sau điều này không? –

Trả lời

29

Bạn sử dụng reflection để gọi các phương thức (hoặc tạo đối tượng, v.v.). Dưới đây là mẫu để gọi phương thức main() trong MyClass. Tất cả những gì bạn cần đảm bảo là MyClass nằm trong classpath.

Class<?> cls = Class.forName("MyClass"); 
Method m = cls.getMethod("main", String[].class); 
String[] params = null; 
m.invoke(null, (Object) params); 
+8

Tôi sẽ không gọi phương thức nhập điểm 'main' để chuyển cho nó một đối số' null'. Trình khởi chạy 'java' gọi' main' với một mảng trống nếu không có đối số dòng lệnh và hầu hết các phương thức 'main' không bận tâm kiểm tra' null'. –

+0

@StephenC thanx cho thông tin trên trình khởi chạy java. Tôi không biết điều đó. –

-6

Nếu bạn không có "MyClass" chuỗi tại thời gian biên dịch, sau đó bạn bằng cách nào đó cần phải nhìn nó lên, cách phổ biến mà khuôn khổ sử dụng để làm điều này:

  • cấu hình một .properties hoặc tệp xml nơi bạn sẽ tìm thấy tên lớp bạn cần.
  • quét thư mục hiện tại cho các tệp .class phù hợp với tiêu chí của bạn.
  • quét tệp .jar cho các tệp .class phù hợp với tiêu chí của bạn.
+0

Không. Xin lỗi, bạn không biết tôi đang làm gì --- hoàn toàn không có cách nào để tôi lấy chuỗi MyClass lúc biên dịch. –

+0

Đó là * preciselly * những gì tôi đề nghị, bạn cần phải phụ thuộc vào một số nguồn thông tin khác (như một tập tin xml), nơi chuỗi MyClass được cấu hình, hoặc bạn cần phải quét các tập tin lớp (hãy nói mọi lớp với một chính tĩnh phương pháp) tại RUNTIME. –

+0

Ồ --- bạn hiểu nhầm câu hỏi của tôi rồi. Nó không phải là về việc nhận được chuỗi, đó là về việc gọi một phương thức tĩnh trên lớp có tên khớp với chuỗi. –

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