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.
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:
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 ý Modifier
nê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.
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());
}
Để 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()]);
}