سؤال

على سبيل المثال ، لدي بعض الفئات التي تحتوي على عدة حقول ، واحدة منها كما هو موضح أدناه ، أريد إخراج جميع حقول مثيلها ، ومع ذلك ، يجب أن أحصل على رسم الخرائط بين اسم العضو بطرق Getter ، هل يمكنني الحصول عليها عن طريق التفكير؟

public class MappingMemberWithGetterOrSetter {
private String memberOne;
private int memberTwo;

public String getMemberOne() {
    return memberOne;
}

public void setMemberOne(String memberOne) {
    this.memberOne = memberOne;
}

public int getMemberTwo() {
    return memberTwo;
}

public void setMemberTwo(int memberTwo) {
    this.memberTwo = memberTwo;
}
}
هل كانت مفيدة؟

المحلول

ربما هذا ما تريد. مع ال المتقلبين يمكنك الحصول على بينينفو وهذا يمنحك الوصول إلى الفول PropertyDescriptors.

BeanInfo beanInfo = Introspector.getBeanInfo(MappingMemberWithGetterOrSetter.class, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    String propertyName = propertyDescriptor.getName();
    Method getter = propertyDescriptor.getReadMethod();
    Method setter = propertyDescriptor.getWriteMethod();
    Field field = MappingMemberWithGetterOrSetter.class
                .getDeclaredField(propertyName);
    System.out.println("Property " + propertyName + " field:  " + field);
    System.out.println("Getter " + getter);
    System.out.println("Setter " + setter);
}

نصائح أخرى

هل هذا ما تريد؟

Class aClass = ...//obtain class object
Field[] methods = aClass.getFields(); 

Field field = ... //obtain field object
String fieldName = field.getName();

بعد ذلك يمكنك الوصول إلى getter و setter من الحقل عبر

Object value = field.get(objectInstance);

field.set(objetInstance, value);

حيث ObjectInstance هو مثيل للفئة التي تمتلك الحقل.

يتم تعريف خاصية في Java بواسطة Getter و/أو Setter. اذا كان لديك getLength الطريقة بدون معلمة ومع قيمة الإرجاع ، لديك خاصية قابلة للقراءة اسمها length. إذا كان لديك طريقة تسمى setLength(Type value) ثم لديك خاصية قابلة للكتابة تسمى length. إذا كان لديك كلاهما ، فإن العقار قابل للقراءة وقابل للكتابة.

لا تشارك الحقول في تعريف خاصية Java. كيف وإذا عادت خصائصك مع الحقول متروك لك.

public long getDoubleLength() { return getLength()*2; }

يشكل خاصية القراءة فقط من الاسم doubleLength. لا يوجد حقل لهذه الخاصية.

إذن ما تريده غير ممكن بشكل عام. إذا كنت ترغب في القيام بذلك لفصول محددة خاصة حيث تعرف أن هذا التعيين موجود أو إذا كنت ترغب في اختبار فئات أخرى لهذا النمط ، فيمكنك الحصول على أساليب وحقول عبر التأمل والتحقق مما إذا كانت الحقول ذات أسماء الممتلكات موجودة.

ولكن هذا قد لا يعمل طوال الوقت. بعض الناس يستخدمون اتفاقيات مثل _member أو mField لأسماء الحقل. هذا على قدم المساواة تمامًا مع تعريف Java Beans حيث يتم تعريف الخصائص بواسطة Getters و Setters ولكنها ستنهار مع النهج الساذج المتمثل في مطابقة الأسماء.

public void getMethods(Class<?> className)
{                   
         Method[] methods = className.getMethods();             
         for(Method method : methods)
            {
           if(method.getDeclaringClass().getName().equalsIgnoreCase("java.lang.Object") )
             {
                 //Do nothing
             }
             else
             {
                if(StringUtils.startsWith( method.getName(),"get"))
                    {   
                        //Here u ll get all get methods                         
                    }
             }                              
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top