2009-06-02 54 views
10

Nói, tôi có một tham chiếu đến một đối tượng Class với SomeType có một phương thức tĩnh. Có cách nào để gọi phương thức đó bằng cách khởi tạo SomeType trước không? Tốt hơn là không thoát gõ mạnh.Gọi phương thức tĩnh trên một lớp học?

CHỈNH SỬA: OK, tôi đã làm hỏng.

interface Int{ 
    void someMethod(); 
} 

class ImplOne implements Int{ 
    public void someMethod() { 
     // do something 
    } 
} 

Class<? extends Int> getInt(){ 
    return ImplOne.class; 
} 

Trong trường hợp này someMethod() không thể tĩnh bất kỳ.

+0

Tôi nghĩ rằng câu hỏi này thực sự là về sự phản chiếu Java, nhưng nó không thực sự rõ ràng. –

+0

Hmm, tôi đoán là không. –

Trả lời

24

một phương pháp tĩnh, theo định nghĩa, được gọi là trên một lớp và không phải trên một thể hiện của lớp đó.

Vì vậy, nếu bạn sử dụng:

SomeClass.someStaticMethod() 

bạn đang instantiating gì (để sang một bên việc nạp lớp và instantiation của lớp SomeClass chính nó, mà JVM xử lý và là cách ra khỏi phạm vi của bạn).

này trái ngược với một phương pháp thông thường được gọi là trên một đối tượng, mà đã được khởi tạo:

SomeObject o = someObject; // had to be instantiated *somewhere* 
o.someMethod(); 
+2

Eclipse (và có thể là các IDE khác) thậm chí cung cấp để cảnh báo bạn nếu bạn đang gọi một phương thức tĩnh bằng cách sử dụng cú pháp cá thể ("Truy cập không tĩnh đến thành viên tĩnh", nó được gọi). Nó không phải là một lỗi, nhưng nó là một chút ít rõ ràng hơn bằng cách sử dụng truy cập một cách rõ ràng tĩnh. –

+1

Tôi nghĩ bản thân trình biên dịch của Sun cũng có vấn đề cảnh báo, ngay bây giờ. Tôi tin rằng nó là khó hiểu, đủ rằng nó phải được thực hiện một lỗi: http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- lỗi-cho-the-java-com – Thilo

24

Tôi không chắc chắn tình hình là gì, nhưng nếu bạn đang tìm cách thực thi phương thức tĩnh trên lớp mà không biết loại lớp (nghĩa là bạn không biết đó là SomeType, bạn chỉ có đối tượng Lớp), nếu bạn biết tên và các thông số của phương pháp bạn có thể sử dụng phản xạ và làm điều này:

Class c = getThisClassObjectFromSomewhere(); 

//myStaticMethod takes a Double and String as an argument 
Method m = c.getMethod("myStaticMethod", Double.class, String.class); 
Object result = m.invoke(null, 1.5, "foo"); 
-1

Yes. Đó là những gì phương pháp tĩnh là tất cả về. Chỉ cần gọi nó. SomeType.yourStaticMethodHere().

10

Vì bạn nói về một đối tượng Lớp, tôi cho rằng bạn quan tâm đến sự phản chiếu Java. Dưới đây là một đoạn trích ngắn để thực hiện những gì bạn đang cố gắng làm:

Class someClass = SomeType.class; 
Method staticMethod = someClass.getMethod("methodName", ...); 

// pass the first arg as null to invoke a static method 
staticMethod.invoke(null, ...); 
Các vấn đề liên quan