Có cách nào để có danh sách các phương thức có thể truy cập được (không nhất thiết là công khai) bởi một lớp nhất định không? Mã được đề cập sẽ nằm trong một lớp hoàn toàn khác.Lấy danh sách các phương pháp có thể truy cập cho một lớp học đã cho qua sự phản chiếu
Ví dụ:
public class A {
public void methodA1();
protected void methodA2();
void methodA3();
private void methodA4();
}
public class B extends A {
public void methodB1();
protected void methodB2();
private void methodB3();
}
Đối với lớp B
Tôi muốn nhận được:
- tất cả các phương pháp riêng của mình
methodA1
vàmethodA2
từ lớpA
methodA3
khi và chỉ nếu lớpB
có cùng gói vớiA
methodA4
không bao giờ được đưa vào kết quả vì không thể truy cập được vào lớp B
. Để làm rõ một lần nữa, mã cần tìm và trả về các phương thức trên sẽ nằm trong một gói/gói hoàn toàn khác.
Hiện tại, Class.getMethods()
chỉ trả về các phương thức công khai và do đó sẽ không làm những gì tôi muốn; Class.getDeclaredMethods()
chỉ trả về các phương thức cho lớp hiện tại. Trong khi tôi chắc chắn có thể sử dụng thứ hai và đi bộ phân cấp lớp lên kiểm tra các quy tắc hiển thị bằng tay, tôi không muốn nếu có một giải pháp tốt hơn. Tôi có thiếu thứ gì đó rõ ràng ở đây không?
Điều đó vẫn không làm những gì tôi muốn vì nó cũng trả về phương thức riêng tư/gói riêng. Mã của bạn hoàn toàn hợp lý cho việc tìm kiếm các phương thức được chú thích; những gì tôi cần là tìm hiểu tại thời gian chạy tất cả các phương thức mà thể hiện 'B' có thể gọi ra. Như tôi đã nói, tôi có thể viết mã để làm như vậy (tương tự như những gì bạn đăng cộng với một vài ifs ném vào để kiểm tra khả năng truy cập) nhưng tôi đã tự hỏi nếu có một cách tốt hơn. – ChssPly76
Cũng không có chức năng API tiêu chuẩn để làm điều đó vì vậy bạn đang viết nó cho mình. Đó là nó. Bạn đang làm những gì có phần là một yêu cầu bất thường. Thông thường với sự phản ánh bạn chỉ quan tâm đến những gì là ** công khai ** có thể truy cập, do đó getMethods() và đó là lý do tại sao chức năng trợ giúp đó tồn tại. Không có trình trợ giúp (chuẩn) nào tồn tại cho những gì bạn muốn, do đó bạn tự viết nó. – cletus
Tôi biết không có API chuẩn; Tôi đã hy vọng ai đó đã có một vấn đề tương tự và tìm thấy một giải pháp - nhưng tôi đoán là không. Tôi không thấy bất cứ điều gì liên quan đến điều này ở những nơi rõ ràng như đậu/javassist/etc ... hoặc. Mã số đã kết thúc được phần nào tham gia, thực sự - phải đối phó với các phương thức tổng hợp trong các lớp lồng nhau, v.v ... – ChssPly76