Làm cách nào để kiểm tra xem một phương thức có phải là phương thức tĩnh hay không bằng cách sử dụng phản xạ?


107

Tôi muốn khám phá CHỈ tại thời điểm chạy các Phương thức tĩnh của một lớp, làm cách nào để thực hiện việc này? Hoặc, làm thế nào để phân biệt giữa các phương thức tĩnh và không tĩnh.

Câu trả lời:


182

Sử dụng Modifier.isStatic(method.getModifiers()).

/**
 * Returns the public static methods of a class or interface,
 *   including those declared in super classes and interfaces.
 */
public static List<Method> getStaticMethods(Class<?> clazz) {
    List<Method> methods = new ArrayList<Method>();
    for (Method method : clazz.getMethods()) {
        if (Modifier.isStatic(method.getModifiers())) {
            methods.add(method);
        }
    }
    return Collections.unmodifiableList(methods);
}

Lưu ý: Phương pháp này thực sự nguy hiểm từ quan điểm bảo mật. Class.getMethods "bypass [es] SecurityManager kiểm tra tùy thuộc vào trình nạp lớp của người gọi ngay lập tức" (xem phần 6 của hướng dẫn mã hóa an toàn Java).

Tuyên bố từ chối trách nhiệm: Không được kiểm tra hoặc thậm chí biên dịch.

Lưu ý Modifiernên sử dụng cẩn thận. Các cờ được biểu thị dưới dạng int không phải là loại an toàn. Một sai lầm phổ biến là kiểm tra cờ bổ trợ trên một loại đối tượng phản chiếu mà nó không áp dụng cho. Có thể xảy ra trường hợp cờ ở cùng vị trí được đặt để biểu thị một số thông tin khác.


Chỉnh sửa câu trả lời: là Modifier thay vì ModifierS -> Sử dụng Modifier.isStatic (method.getModifiers ()) Thx cho câu trả lời!
Telcontar

4
Vâng, cảm ơn. Mặc dù tôi khẳng định tên là một thiết kế sai. Modifier không đại diện cho một modifier. Nhưng sau đó cả lớp là một sự sai lệch. Và có lẽ cả sự phản ánh nữa.
Tom Hawtin - tackline

btw cùng cũng làm việc cho Fields, mà còn cung cấp một phương pháp getModifiers ()
Gregor

14

Bạn có thể lấy các phương thức tĩnh như sau:

for (Method m : MyClass.class.getMethods()) {
   if (Modifier.isStatic(m.getModifiers()))
      System.out.println("Static Method: " + m.getName());
}

5

Để xác định câu trả lời (đúng) trước đó, đây là đoạn mã đầy đủ thực hiện những gì bạn muốn (bỏ qua các ngoại lệ):

public Method[] getStatics(Class<?> c) {
    Method[] all = c.getDeclaredMethods()
    List<Method> back = new ArrayList<Method>();

    for (Method m : all) {
        if (Modifier.isStatic(m.getModifiers())) {
            back.add(m);
        }
    }

    return back.toArray(new Method[back.size()]);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.