ดึงฟิลด์คงที่เท่านั้นที่ประกาศในคลาส Java


163

ฉันมีชั้นเรียนต่อไปนี้:

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

เป็นไปได้หรือไม่ที่จะใช้การสะท้อนเพื่อรับรายการของฟิลด์คงที่เท่านั้น? Test.class.getDeclaredFields()ฉันรู้ฉันจะได้รับอาร์เรย์ของฟิลด์ทั้งหมดที่มี แต่ดูเหมือนว่าไม่มีวิธีการตรวจสอบว่าFieldอินสแตนซ์เป็นตัวแทนของสนามคงที่หรือไม่


ฉันเป็นจาวารุ่นใหม่ฉันอยากรู้ว่าทำไม Java ไม่ได้ใส่คุณสมบัติเหล่านี้ไว้ในคลาส Field เช่น C #, อะไรคือข้อดีของการออกแบบนี้? ขอบคุณ
อัลเลน

คำตอบ:


327

คุณสามารถทำได้เช่นนี้:

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

ฉันบังเอิญพบคำถามนี้โดยบังเอิญและรู้สึกว่าจำเป็นต้องมีการอัปเดต Java 8 โดยใช้สตรีม:

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;
}

เห็นได้ชัดว่าตัวอย่างนั้นเป็นบิต embelished สำหรับการอ่าน ในความเป็นจริงคุณน่าจะเขียนแบบนี้:

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

4
"ในความเป็นจริงคุณน่าจะเขียนแบบนี้" ... ทำไมคุณถึงคิดว่า "ตามความเป็นจริง" ที่การอ่านไม่สำคัญ?
Michael

2
ก่อนอื่นฉันไม่คิดว่าการล้อเลียนคนในเว็บไซต์เช่นนี้เหมาะสม นอกเหนือจากนั้นฉันไม่เชื่อว่าความคิดเห็นในตัวอย่างที่มีการจัดทำขึ้นจะช่วยให้ผู้อ่านคุ้นเคยกับสตรีมจากระยะไกลได้ดียิ่งขึ้นและไม่มีตัวแปรส่งคืนที่ไร้ประโยชน์ ฉันจะพิจารณาทั้งสองเสียงถ้าฉันพบพวกเขาในรหัสจริง ด้วยประสบการณ์มากขึ้นกับกระแสข้อมูลภายใต้เข็มขัดของฉันวันนี้ฉันจะเลือกที่จะเก็บบรรทัดใหม่ดั้งเดิมไว้เพื่อให้สามารถอ่านได้ ไม่มีใครสมบูรณ์แบบ. ฉันมุ่งที่จะให้ทั้งตัวอย่างที่ชัดเจนสำหรับโปรแกรมเมอร์ใหม่รวมถึงตัวอย่างที่เป็นจริง
แรงบิด

3
ฉันไม่ได้ล้อเลียนภาษาอังกฤษของคุณ ภาษาอังกฤษของคุณดี. ฉันไม่เข้าใจแม้แต่สิ่งที่คุณกำลังพูดถึง และใช่ฉันเห็นด้วยว่าความคิดเห็นนั้นฟุ่มเฟือยและการจัดรูปแบบของรูปแรกดีกว่ามาก ประเด็นของฉันคือคุณดูเหมือนจะแนะนำว่า "การตกแต่งเพื่อความสะดวกในการอ่าน" นั้นไม่ดีเมื่อการอ่านเป็นตัวชี้วัดคุณภาพของรหัสที่สำคัญอย่างไม่น่าเชื่อ
Michael


0

ง่ายมากคุณสามารถใช้ตัวแก้ไขเพื่อตรวจสอบว่าเขตข้อมูลเป็นแบบคงที่หรือไม่ นี่คือตัวอย่างโค้ดสำหรับงานประเภทนั้น

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");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.