0

フィールド (またはメソッド パラメーター) の注釈付きの型を ParameterSpec インスタンスと比較する必要があります。このコンテキストでは、パラメーターの名前は重要ではありません。コンテキストは、未解決の問題 136に多少関連しています。

次のテストは緑色ですが、比較コードではタイプ セーフな文字列変換が使用されていません。よりタイプセーフなアプローチを誰が思いつくでしょうか?

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.junit.Assert;
import org.junit.Test;

import com.squareup.javapoet.ParameterSpec;

@SuppressWarnings("javadoc")
public class JavaPoetTest {

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ ElementType.PARAMETER, ElementType.TYPE_USE })
  @interface Tag {}

  public static int n;
  public static @Tag int t;

  public static boolean isParameterSpecSameAsAnnotatedType(ParameterSpec parameter, AnnotatedType type) {
    if (!parameter.type.toString().equals(type.getType().getTypeName()))
      return false;

    List<String> specAnnotations = parameter.annotations.stream()
        .map(a -> a.type.toString())
        .collect(Collectors.toList());
    List<String> typeAnnotations = Arrays.asList(type.getAnnotations()).stream()
        .map(a -> a.toString().replace('$', '.').replace("()", "").replace("@", ""))
        .collect(Collectors.toList());

    return specAnnotations.equals(typeAnnotations);
  }

  @Test
  public void testN() throws Exception {
    AnnotatedType annotatedType = JavaPoetTest.class.getField("n").getAnnotatedType();
    ParameterSpec parameterSpec = ParameterSpec.builder(int.class, "name").build();
    Assert.assertTrue(isParameterSpecSameAsAnnotatedType(parameterSpec, annotatedType));
  }

  @Test
  public void testT() throws Exception {
    AnnotatedType annotatedType = JavaPoetTest.class.getField("t").getAnnotatedType();
    ParameterSpec parameterSpec = ParameterSpec.builder(int.class, "name").addAnnotation(Tag.class).build();
    Assert.assertTrue(isParameterSpecSameAsAnnotatedType(parameterSpec, annotatedType));
  }

}
4

1 に答える 1