Java: รับชื่อตัวแปรทั้งหมดในคลาส


93

ฉันมีชั้นเรียนและต้องการค้นหาช่องสาธารณะทั้งหมด (ไม่ใช่วิธีการ) ฉันจะทำเช่นนี้ได้อย่างไร?

ขอบคุณ!


คุณควรจะสามารถทำได้โดยใช้การสะท้อน API
Crozin

คำตอบ:


135
Field[] fields = YourClassName.class.getFields();

ส่งคืนอาร์เรย์ของตัวแปรสาธารณะทั้งหมดของคลาส

getFields()ส่งคืนฟิลด์ในการสืบทอดคลาสทั้งหมด หากคุณต้องการกำหนดฟิลด์เฉพาะในคลาสที่เป็นปัญหาเท่านั้นและไม่ใช่คลาสระดับสูงให้ใช้getDeclaredFields()และกรองฟิลด์publicด้วยModifierวิธีการต่อไปนี้:

Modifier.isPublic(field.getModifiers());

อักษรจริงเป็นวัตถุของการพิมพ์YourClassName.class java.lang.Classตรวจสอบเอกสารสำหรับวิธีการสะท้อนที่น่าสนใจยิ่งขึ้น

ระดับเหนือขึ้นไปเป็นField java.lang.reflect.Fieldคุณอาจดูที่java.lang.reflectแพ็คเกจทั้งหมด


2
เพียงแค่หมายเหตุ - ในตอนแรกคำตอบของฉันมีข้อความที่ไม่ถูกต้อง แต่ก็มีการโหวตหลายครั้ง โปรดอ่านอย่างละเอียด;)
Bozho

1
@downvoter - ความผิดพลาดเกิดขึ้นก่อนหน้านี้ ถ้าคุณเห็นตอนนี้โปรดแบ่งปัน
Bozho

วิธีนี้ช้าหรือไม่ หรือเราสามารถใช้มันได้อย่างอิสระ?
Dany Y

ไม่เป็นไร. แต่อย่าใช้มากเกินไป
Bozho


15

คุณสามารถใช้สองอย่างใดก็ได้ตามความต้องการของคุณ:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

ในการกรองเฉพาะฟิลด์สาธารณะจากรายการด้านบน (ตามข้อกำหนด) ให้ใช้โค้ดด้านล่าง:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

ตามที่กล่าวไว้โดยผู้ใช้เพียงไม่กี่คนโค้ดด้านล่างสามารถช่วยค้นหาฟิลด์ทั้งหมดในคลาสที่กำหนดได้

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

อย่างไรก็ตามแนวทางที่น่าสนใจกว่าอยู่ด้านล่าง:

ด้วยความช่วยเหลือของไลบรารี Jackson ฉันสามารถค้นหาคุณสมบัติคลาสทั้งหมดของประเภท String / integer / double และค่าตามลำดับในคลาส Map ( โดยไม่ต้องใช้ API การสะท้อน! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.