2010-01-20 35 views
5

Có thể gọi phương thức không có trình sửa đổi trong siêu lớp thông qua phản chiếu Java không?Phương pháp truy cập phản xạ Java với công cụ sửa đổi mặc định trong lớp siêu

+0

Lưu ý rằng điều quan trọng là phải xác định xem phương pháp bạn đang cố gắng gọi đã bị ghi đè trong lớp con hay chưa. Bạn có thể gọi phương thức bảo vệ gói (hay còn gọi là truy cập mặc định) thông qua sự phản chiếu không? Vâng. Bạn có thể gọi một phương thức ghi đè thông qua sự phản chiếu không? Không, phương thức ghi đè sẽ được gọi. Các câu trả lời dưới đây đưa ra các giả định khác nhau về vấn đề này. –

Trả lời

1

Có. Bạn có thể cần gọi setAccessible (true) trên đối tượng Method trước khi bạn gọi nó.

+0

cả getMethod và getDeclaredMethod thất bại nếu được gọi trên lớp con. và setAccessible là không cần thiết. – Bozho

+0

Từ nhận xét đó, tôi đoán bạn đang cố gắng gọi một phương thức với các tham số. Bạn cần xác định những điều này khi tra cứu Phương thức. – Stroboskop

+0

Tôi không phải là OP;) – Bozho

7
Method method = getClass().getSuperclass().getDeclaredMethod("doSomething"); 
method.invoke(this); 

nếu bạn có một hệ thống phân cấp lớn hơn, bạn có thể sử dụng:

Class current = getClass(); 
Method method = null; 
while (current != Object.class) { 
    try { 
      method = current.getDeclaredMethod("doSomething"); 
      break; 
    } catch (NoSuchMethodException ex) { 
      current = current.getSuperclass(); 
    } 
} 
// only needed if the two classes are in different packages 
method.setAccessible(true); 
method.invoke(this); 

(các ví dụ trên là dành cho một phương thức có tên doSomething không có đối số Nếu phương pháp của bạn có đối số, bạn phải thêm họ. các loại làm đối số cho phương pháp getDeclaredMethod(...))

+1

Sẽ không tốt hơn nếu bạn lấy lại 'Method []' bằng cách sử dụng 'getDeclaredMethods()' và kiểm tra xem chúng ta có một tên phương thức khớp với hơn là bắt ngoại lệ không? Không phải là thứ hai khá chậm vì một dấu vết ngăn xếp phải được tạo ra mỗi lần? Hay tôi đang tối ưu hóa sớm? :) –

+0

Stacktraces được tạo ra một cách lười biếng; nếu bạn không yêu cầu, nó không được tạo ra. Bạn có thể kiểm tra điều này bằng cách thiết lập một điểm dừng trong phương thức getOurStacktrace của Throwable và sau đó ném và ngoại lệ. – Ajax

4

Sau khi đọc câu hỏi gốc - Tôi nhận ra rằng tôi cho rằng bạn đang cố gọi một phương thức ghi đè. Đó là những gì tôi đã cố gắng để làm và làm thế nào tôi đến để tìm chủ đề này. Việc gọi một phương thức không được ghi đè của lớp cơ sở sẽ hoạt động như các phương thức khác ở đây đã mô tả. Tuy nhiên, nếu bạn đang cố gắng gọi một phương pháp ghi đè, câu trả lời của tôi là viết tắt như dưới đây:

Tôi không nghĩ rằng gọi một phương thức ghi đè là có thể, mỗi

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

Đáng chú ý nhất:

Method.invoke

Nếu phương thức cơ bản là một phương thức thể hiện, nó được gọi bằng cách sử dụng tra cứu phương pháp động như được ghi trong Đặc tả Ngôn ngữ Java, Ấn bản thứ hai, phần 15.12.4.4; đặc biệt, ghi đè dựa trên kiểu thời gian chạy của đối tượng đích sẽ xảy ra.

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