Eclipse JDT адаптер для java.lang.reflect - PullRequest
0 голосов
/ 23 мая 2011

Мне нужно интегрировать Eclipse JDT в некоторый существующий API, основанный на java.lang.reflect .Мои вопросы: есть ли существующий интерфейс или адаптер?Каков наилучший способ сделать это?Может кто-нибудь указать мне учебник, чтобы сделать это?

Например, мне нужно получить java.lang.reflect.Method из org.eclipse.jdt.core.dom.IMethodBinding.

Точно так же мне нужно получить java.lang.Class от org.eclipse.jdt.core.dom.Type или org.eclipse.jdt.core.dom.ITypeBinding.Я обнаружил, что это может быть достигнуто с помощью:

Class<?> clazz = Class.forName(typeBinding.getBinaryName());

Конечно, это очень простое решение, предполагающее, что класс уже существует в пути к классам и не изменяется через JDT API - так что этоот идеального.Но следует отметить, что эти два допущения справедливы для моей конкретной ситуации.

1 Ответ

0 голосов
/ 25 мая 2011

Учитывая, что класс уже существует на пути к классам и существенно не изменяется через JDT API, я сам что-то реализовал.

Например, IMethodBinding можно преобразовать в Method с помощью следующего кода:

    IMethodBinding methodBinding = methodInvocation.resolveMethodBinding();
    Class<?> clazz = retrieveTypeClass(methodBinding.getDeclaringClass());
    Class<?>[] paramClasses = new Class<?>[methodInvocation.arguments().size()];
    for (int idx = 0; idx < methodInvocation.arguments().size(); idx++) {
        ITypeBinding paramTypeBinding = methodBinding.getParameterTypes()[idx];
        paramClasses[idx] = retrieveTypeClass(paramTypeBinding);
    }
    String methodName = methodInvocation.getName().getIdentifier();
    Method method;
    try {
        method = clazz.getMethod(methodName, paramClasses);
    } catch (Exception exc) {
        throw new RuntimeException(exc);
    }

private Class<?> retrieveTypeClass(Object argument) {
    if (argument instanceof SimpleType) {
        SimpleType simpleType = (SimpleType) argument;
        return retrieveTypeClass(simpleType.resolveBinding());
    }
    if (argument instanceof ITypeBinding) {
        ITypeBinding binding = (ITypeBinding) argument;
        String className = binding.getBinaryName();
        if ("I".equals(className)) {
            return Integer.TYPE;
        }
        if ("V".equals(className)) {
            return Void.TYPE;
        }
        try {
            return Class.forName(className);
        } catch (Exception exc) {
            throw new RuntimeException(exc);
        }
    }
    if (argument instanceof IVariableBinding) {
        IVariableBinding variableBinding = (IVariableBinding) argument;
        return retrieveTypeClass(variableBinding.getType());
    }
    if (argument instanceof SimpleName) {
        SimpleName simpleName = (SimpleName) argument;
        return retrieveTypeClass(simpleName.resolveBinding());
    }
    throw new UnsupportedOperationException("Retrieval of type " + argument.getClass() + " not implemented yet!");
}

Обратите внимание, что метод retrieveTypeClass также решает вторую проблему. Надеюсь, это кому-нибудь поможет.

...