ฉันจะตรวจสอบได้อย่างไรว่าวิธีการนั้นเป็นแบบคงที่โดยใช้การสะท้อน?


107

ฉันต้องการค้นพบเฉพาะวิธีการคงที่ของชั้นเรียนเท่านั้นฉันจะทำสิ่งนี้ได้อย่างไร หรือวิธีแยกความแตกต่างระหว่างวิธีการคงที่และไม่คงที่

คำตอบ:


183

ใช้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);
}

หมายเหตุ: วิธีนี้เป็นอันตรายจากจุดยืนด้านความปลอดภัย Class.getMethods "bypass [es] SecurityManager ตรวจสอบโดยขึ้นอยู่กับตัวโหลดคลาสของผู้โทรในทันที" (ดูส่วนที่ 6 ของแนวทางการเข้ารหัส Java ที่ปลอดภัย)

คำเตือน: ไม่ได้ทดสอบหรือแม้แต่รวบรวม

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


แก้ไขคำตอบ: เป็น Modifier แทน ModifierS -> Use Modifier.isStatic (method.getModifiers ()) Thx for the Answer!
Telcontar

4
ใช่ขอบคุณ แม้ว่าฉันจะอ้างว่าชื่อเป็นการออกแบบที่ไม่เหมาะสม ตัวปรับเปลี่ยนไม่ได้แสดงถึงตัวปรับแต่ง แต่แล้วทั้งชั้นเรียนก็เป็นการออกแบบที่ไม่เหมาะสม และอาจสะท้อนด้วย
Tom Hawtin - แทคไลน์

btw เช่นเดียวกันกับ Fields ซึ่งมีวิธี getModifiers ()
Gregor

14

คุณสามารถรับวิธีการคงที่เช่นนี้:

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

5

เพื่อสรุปคำตอบก่อนหน้า (ที่ถูกต้อง) ต่อไปนี้เป็นข้อมูลโค้ดแบบเต็มซึ่งทำในสิ่งที่คุณต้องการ (ยกเว้นข้อยกเว้น):

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