Chỉ truy xuất các trường tĩnh được khai báo trong lớp Java


163

Tôi có lớp sau:

public class Test {
    public static int a = 0;
    public int b = 1;
}

Có thể sử dụng sự phản chiếu để có được một danh sách các trường tĩnh không? Tôi biết tôi có thể có được một mảng của tất cả các lĩnh vực với Test.class.getDeclaredFields(). Nhưng dường như không có cách nào để xác định xem một Fieldthể hiện có đại diện cho trường tĩnh hay không.


Tôi là một java mới hơn, tôi muốn biết tại sao Java không đưa tất cả các tính năng này vào lớp Field như C #, lợi ích từ thiết kế này là gì? Cảm ơn.
Allen

Câu trả lời:


327

Bạn có thể làm như thế này:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}

12

Tôi tình cờ gặp câu hỏi này và cảm thấy cần cập nhật Java 8 bằng cách sử dụng các luồng:

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

Rõ ràng, mẫu đó là một chút tô điểm cho khả năng đọc. Trong thực tế, bạn có thể sẽ viết nó như thế này:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}

4
"Trên thực tế, bạn có thể sẽ viết nó như thế này" ... tại sao bạn nghĩ rằng "trong thực tế" mà khả năng đọc không quan trọng?
Michael

2
Trước hết, tôi không nghĩ việc nhạo báng ai đó tiếng Anh trên một trang web như thế này là phù hợp. Bên cạnh đó, tôi không tin rằng các bình luận trong ví dụ được tô điểm phục vụ để cải thiện khả năng đọc cho ai đó thậm chí từ xa quen thuộc với các luồng, cũng không phải là biến trả về vô dụng. Tôi sẽ xem xét cả tiếng ồn nếu tôi gặp chúng trong mã thực tế. Với nhiều kinh nghiệm hơn với các luồng dưới vành đai của tôi, hôm nay tôi sẽ chọn giữ các dòng mới ban đầu để dễ đọc. Không ai là hoàn hảo cả. Tôi nhằm mục đích cung cấp cả một ví dụ rõ ràng cho các lập trình viên mới cũng như một ví dụ thực tế.
Mô-men xoắn

3
Tôi không chế nhạo tiếng Anh của bạn. Tiếng Anh của bạn tốt. Tôi thậm chí không hiểu những gì bạn đang nói về. Và vâng, tôi đồng ý rằng các ý kiến ​​là không cần thiết và định dạng của đầu tiên là tốt hơn nhiều. Quan điểm của tôi là dường như bạn cho rằng "tôn tạo cho khả năng đọc" là không tốt, khi khả năng đọc là một chỉ số chất lượng mã cực kỳ quan trọng.
Michael


0

Điều đó đơn giản, bạn có thể sử dụng Công cụ sửa đổi để kiểm tra xem một trường có tĩnh hay không. Đây là một mã mẫu cho loại nhiệm vụ đó.

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}
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.