ฉันต้องการค้นพบเฉพาะวิธีการคงที่ของชั้นเรียนเท่านั้นฉันจะทำสิ่งนี้ได้อย่างไร หรือวิธีแยกความแตกต่างระหว่างวิธีการคงที่และไม่คงที่
ฉันต้องการค้นพบเฉพาะวิธีการคงที่ของชั้นเรียนเท่านั้นฉันจะทำสิ่งนี้ได้อย่างไร หรือวิธีแยกความแตกต่างระหว่างวิธีการคงที่และไม่คงที่
คำตอบ:
ใช้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 ไม่ปลอดภัย ข้อผิดพลาดทั่วไปคือการทดสอบแฟล็กโมดิฟายเออร์กับประเภทของวัตถุสะท้อนที่ไม่เกี่ยวข้อง อาจเป็นกรณีที่มีการตั้งค่าสถานะในตำแหน่งเดียวกันเพื่อแสดงถึงข้อมูลอื่น ๆ
คุณสามารถรับวิธีการคงที่เช่นนี้:
for (Method m : MyClass.class.getMethods()) {
if (Modifier.isStatic(m.getModifiers()))
System.out.println("Static Method: " + m.getName());
}
เพื่อสรุปคำตอบก่อนหน้า (ที่ถูกต้อง) ต่อไปนี้เป็นข้อมูลโค้ดแบบเต็มซึ่งทำในสิ่งที่คุณต้องการ (ยกเว้นข้อยกเว้น):
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()]);
}