2017-01-19 1 views
4

getMethods() 메서드를 사용하여 IType의 모든 메소드에 액세스 할 수 있습니다. 그러한 IMethod이 접근 자 또는 변형 자 (getter/setter)인지 확인하는 효율적인 방법이 있습니까?IType의 모든 IM 메소드의 접근 자와 변경자 (getter/setters) 식별

IMethod의 이름이 날 뻔한 사람을 감지 도움이 될 prefix ∈ {"get", "set", "is"}로 계획 prefix + NameOfAttribute 일치하지만, 접근 또는 뮤 테이터 (게터/세터가) 그런 식으로 이름이되어 있지 않은 경우, 그것은 작동하지 않을 경우 확인.

더 좋은 방법이 있습니까?

EDIT : 나는 IType의 속성을 직접 가져 오거나 설정하는 getter/setter 메서드 만 식별하고 다른 작업은 수행하지 않습니다.

EDIT2 : 사용 된 기술 용어 : 접근 & 뮤 테이터

EDIT3 : 여기에 모든 해답을 읽은 후 내 솔루션됩니다 :

private boolean isAccessor(IMethod method) throws JavaModelException { 
     if (isAccessMethod("get", method) || isAccessMethod("is", method)) { // if name fits 
      return method.getNumberOfParameters() == 0 && !Signature.SIG_VOID.equals(method.getReturnType()); 
     } 
     return false; 
    } 

    private boolean isMutator(IMethod method) throws JavaModelException { 
     if (isAccessMethod("set", method)) { // if name fits 
      return method.getNumberOfParameters() == 1 && Signature.SIG_VOID.equals(method.getReturnType()); 
     } 
     return false; 
    } 

    private boolean isAccessMethod(String prefix, IMethod method) throws JavaModelException { 
     IType type = method.getDeclaringType(); 
     for (IField field : type.getFields()) { // for ever field of IType: 
      if (method.getElementName().equalsIgnoreCase(prefix + field.getElementName())) { 
       return true; // is access method if name scheme fits for one field 
      } 
     } 
     return false; // is not an access method if no field fits 
    } 

중요 :이 솔루션은 내 요구 사항에 맞는 중요한 일부 사례는 무시합니다 (accepted answer 참조). 여전히 메소드의 기능을 점검하지는 않지만 꽤 잘 작동합니다. 제안 된 체계의 메소드 이름을 확인합니다. 그러나 매개 변수 개수와 반환 유형이 void인지 여부도 확인합니다. 누군가가 이것을 향상시키고 싶다면 getter의 리턴/매개 변수 유형이 메소드 이름과 일치 된 필드 유형과 일치하는지 여부를 점검 할 수 있습니다.

답변

2

JDT 코어에서 getter와 setter를 식별 할 수있는 지원이 없다고 생각합니다.

필드 이름을 기반으로하여 getter/setter 이름 생성을 제공하는 공용 API 만 JDT에 있습니다. 예 : NamingConventionsuggestGetterName() 방법을보십시오.

GetterSetterUtil과 같은 다른 내부 클래스도 원하는 방법을 제공하지 않습니다.

마지막으로 나는 속성 접근 감지기를 직접 만들 것입니다. 아마도 Collection에 적용 할 수있는 필터 일 수 있습니다.

IMethod의 이름

는 또한 부울 속성과의 경우에는 is 접두사를 확인 접두사 ∈ { "세트"를 "GET"}로 계획 접두사 + NameOfAttribute 일치하는 경우 확인 메서드의 매개 변수 목록입니다. getter는 일반적으로 매개 변수를 사용하지 않지만 setter는 일반적으로 하나의 매개 변수를 사용합니다. 나는 보통 JavaBeans specification도 색인 된 속성을 허용하기 때문에 말했다. 예 :

void setter(int index, PropertyType value); // indexed setter 
PropertyType getter(int index); // indexed getter 
void setter(PropertyType values[]); // array setter 
PropertyType[] getter(); // array getter 

편집은 내 게시물에 대한 여러분의 제안에 따라 내 자신의 솔루션을 추가했다.

귀하의 솔루션이 귀하의 요구 사항에 맞을 수도 있습니다. 속성에는 직접적인 배킹 필드가 없을 수 있습니다. 속성의 개념은 좀 더 추상적입니다. 제 이름이 visible이고 getter가 isVisible() 인 경우 클래스에 필드가 private boolean visible이 아닐 수도 있습니다.

rootPane에서 JComponent의 속성을 확인해야합니다. Introspector이 반환하기 때문에 이것은 분명히 재산입니다. 당신은 구현을 살펴 아닌 경우 직접 백업 필드를 사용

BeanInfo jcomponentBeanInfo = Introspector.getBeanInfo(JComponent.class); 

PropertyDescriptor[] propertyDescriptors = jcomponentBeanInfo.getPropertyDescriptors(); 
for (int i = 0; i < propertyDescriptors.length; i++) { 
    PropertyDescriptor propertyDescriptor = propertyDescriptors[i]; 
    if("rootPane".equals(propertyDescriptor.getName())){ 
    System.out.println("Found property rootPane"); 
    break; 
    } 
} 

Found property rootPane 

인쇄됩니다 그러나 않습니다.

public static JRootPane getRootPane(Component c) { 
    if (c instanceof RootPaneContainer) { 
     return ((RootPaneContainer)c).getRootPane(); 
    } 
    for(; c != null; c = c.getParent()) { 
     if (c instanceof JRootPane) { 
      return (JRootPane)c; 
     } 
    } 
    return null; 
} 

public JRootPane getRootPane() { 
    return SwingUtilities.getRootPane(this); 
} 

SwingUtilities.getRootPane 난 그냥이 더 명확하게하고 싶다.

+0

접두사에 대한 힌트를 주셔서 감사합니다. 잊어 버렸을 것입니다! 또한 매개 변수 개수가 좋습니다. – ConveniencePatterns

+0

내 게시물에 대한 내 제안을 토대로 내 솔루션을 추가했습니다. – ConveniencePatterns

+1

@ConveniencePatterns 그냥 내 대답을 업데이트했습니다 –

1

내 접근 방식은 다음과 같습니다 당신은 각 필드에 대한 IType 다음 getElementName()getFields()을 사용할 수 있습니다

for (IMethod m : iType.getMethods()) { 
    if (m.getElementName().substring(0,3).equals("get")) { 
     //do something 
    } else if (m.getElementName().substring(0,3).equals("set")) { 
     //do something else 
    } 
} 

.

+1

이것은 제 질문에서 제안한 것과 매우 흡사합니다. 문제는 만약 메소드가 getter가 아니고'getXYZ()'라고 이름 지어진다면 그것은 getter로 잘못 선언 될 것입니다. – ConveniencePatterns

+0

'getFields()'를 호출하여 선언 된 필드의 배열을 얻을 수 있습니다. 그런 다음 각 루프에 대해 ... for (필드 필드 : iType.getFields())'를 사용하십시오. –

+0

그래,하지만 여전히 메서드의 이름 만 검사합니다. 이것은 괜찮은 해결책이지만 JDT API를 사용하여 메소드의 기능을 검사하는 방법이있을 수 있습니다. – ConveniencePatterns

관련 문제