Используйте JDT для получения полного имени метода

Вы могли использовать

(?:F|f)(?:O|o)(?:O|o)

?: в скобках в средствах.Net это не получает, и просто используемое для группировки условий | (или) оператор.

5
задан James Van Boxtel 11 November 2009 в 00:41
поделиться

3 ответа

Благодаря iain и дополнительным исследованиям я нашел это решение. Похоже, что-то подобное должно быть встроено в JDT ....

import org.eclipse.jdt.core.Signature;

private static String getMethodFullName(IMethod iMethod)
{
        StringBuilder name = new StringBuilder();
        name.append(iMethod.getDeclaringType().getFullyQualifiedName());
        name.append(".");
        name.append(iMethod.getElementName());
        name.append("(");

        String comma = "";
        String[] parameterTypes = iMethod.getParameterTypes();
        try {
            String[] parameterNames = iMethod.getParameterNames();
            for (int i=0; i<iMethod.getParameterTypes().length; ++i) {
                name.append(comma);
                name.append(Signature.toString(parameterTypes[i]));
                name.append(" ");
                name.append(parameterNames[i]);
                comma = ", ";
            }
        } catch (JavaModelException e) {
        }

        name.append(")");

        return name.toString();
}
3
ответ дан 14 December 2019 в 08:53
поделиться

Полное имя типа можно получить с помощью

method.getDeclaringType().getFullyQualifiedName();

. Это, вероятно, проще, чем доступ к пакету из модуля компиляции. Остальная часть вашей функции выглядит правильно.

Один небольшой момент: вы должны использовать StringBuilder для построения строки вместо добавления к стандартной String. Строки неизменяемы, поэтому сложение создает множество ненужных временных объектов.

private static String getMethodFullName(IMethod iMethod)
{
        StringBuilder name = new StringBuilder();
        name.append(iMethod.getDeclaringType().getFullyQualifiedName());
        name.append(".");
        name.append(iMethod.getElementName());
        name.append("(");

        String comma = "";
        for (String type : iMethod.getParameterTypes()) {
                name.append(comma);
                comma = ", ";
                name.append(type);
        }
        name.append(")");

        return name.toString();
}
4
ответ дан 14 December 2019 в 08:53
поделиться

Я не уверен, что он будет учитывать все случаи (метод внутри внутреннего класса, анонимный класс, с общими параметрами ...)

Когда дело доходит до сигнатур методов, следующие классы:

Вам необходимо получить jdt .core.dom.IMethodBinding , из которого вы можете извлечь все, что вам нужно.

Если у вас есть MethodInvocation , вы можете:

//MethodInvocation node
ITypeBinding type = node.getExpression().resolveTypeBinding();
IMethodBinding  method=node.resolveMethodBinding();
0
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: