0

私の場合、 Guavaapplyインターフェイスの特定の実装のメソッドのパラメーターが注釈付きかどうかを調べたいと思います。実装する方法: Function@Nullable

boolean isNullableArgument(Class<? extends Function<?,?>> function);

クラスapplyから実装されたメソッドを取得する方法がわかりません。function


たとえば、Function次のような実装が考えられます。

new Function<String,Integer>() {
    public Integer apply(String input) { … }
    public Integer apply(Integer input) { … }
}
4

3 に答える 3

2

解決策は次のとおりです。

import com.google.common.base.Function;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Map;
import javax.annotation.Nullable;
import org.apache.commons.lang3.reflect.TypeUtils;

public class FunkUtils { private FunkUtils() {}

    public static boolean isNullableArgument(Class<? extends Function> functionClass) throws Exception {
        Map<TypeVariable<?>,Type> typeArgs = TypeUtils.getTypeArguments(functionClass, Function.class);
        TypeVariable<?> argTypeParam = Function.class.getTypeParameters()[0];
        Type argType = typeArgs.get(argTypeParam);
        Class argClass = TypeUtils.getRawType(argType, null);
        Method applyMethod = functionClass.getDeclaredMethod("apply", argClass);
        Annotation[] argAnnos = applyMethod.getParameterAnnotations()[0];
        for (int i = 0; i < argAnnos.length; i++) {
            if (argAnnos[i] instanceof Nullable) return true;
        }
        return false;
    }
}

commons-lang3 バージョン 3.1 の TypeUtils.getTypeArguments にバグがありますが、現在開発中の 3.2 で修正されています。

于 2013-09-12T02:54:13.227 に答える