문제

예를 들어, 여러 필드가있는 클래스가 있습니다. 그 중 하나는 아래와 마찬가지로 인스턴스의 모든 필드를 출력하고 싶지만 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;
}
}
도움이 되었습니까?

해결책

어쩌면 이것이 당신이 원하는 것일 수도 있습니다. 이랑 내장가 당신은 얻을 수 있습니다 beaninfo 그리고 이것은 콩에 대한 접근성을 제공합니다 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 of the Field에 액세스 할 수 있습니다.

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 필드 이름을 위해. 이것은 속성이 getters and setters에 의해 정의되는 Java Beans 정의와 완전히 비슷하지만 일치하는 이름의 순진한 접근 방식으로 깨질 것입니다.

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