getMethods()
の方法でIType
のすべてのメソッドにアクセスできます。そのようなIMethod
がアクセサーかミューテータ(ゲッター/セッター)かどうかを判断する効率的な方法はありますか? IMethod
の名前がprefix ∈ {"get", "set", "is"}
とスキームprefix + NameOfAttribute
と一致するかどうかのチェックITypeのすべてのIMメソッドのアクセサーとミューテータ(ゲッター/セッター)の特定
は明白なものを検出するために私を助けるだろうが、アクセサまたはミューテータ(ゲッター/セッター)がそのように命名されていない場合、それは動作しません。
良い方法がありますか?
EDIT:私は、IType
の属性を直接取得/設定するゲッター/セッターメソッドを特定したいだけで、何もしません。
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
かどうかチェックします。誰かがこれを改善したい場合、ゲッターの戻り値/パラメータータイプがメソッド名と一致したフィールドのタイプと一致するかどうかをチェックすることもできます。
接頭辞についてのヒントのおかげで、私はそれを忘れてしまったでしょう!また、パラメータ数は良い考えです。 – ConveniencePatterns
あなたの提案に基づいて自分の投稿を自分の投稿に追加しました。 – ConveniencePatterns
@ConveniencePatternsただ私の答えを –