0

java.lang.reflectに基づく既存の API にEclipse JDTを統合する必要があります。私の質問は次のとおりです。既存のインターフェースまたはアダプターはありますか? これを行う最善の方法は何ですか?誰でもこれを行うためのチュートリアルを教えてもらえますか?

たとえば、java.lang.reflect.Methodからを取得する必要がありますorg.eclipse.jdt.core.dom.IMethodBinding

同様に、またはjava.lang.Classからを取得する必要があります。これは次の方法で実現できることがわかりました。org.eclipse.jdt.core.dom.Typeorg.eclipse.jdt.core.dom.ITypeBinding

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

もちろん、これはクラスがクラスパスに既に存在し、JDT API を介して変更されていないことを前提とする非常に単純なソリューションであるため、完全にはほど遠いものです。しかし、これらの 2 つの仮定は、私の特定の状況にも当てはまります。

4

1 に答える 1

0

クラスがクラスパスに既に存在し、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は 2 番目の問題も解決することに注意してください。これが誰にも役立つことを願っています。

于 2011-05-25T11:49:03.783 に答える