Apache Commons AnnotationUtilsの助けを借りてプロキシ アプローチを使用するかなり大雑把な方法
public static <A extends Annotation> A mockAnnotation(Class<A> annotationClass, Map<String, Object> properties) {
return (A) Proxy.newProxyInstance(annotationClass.getClassLoader(), new Class<?>[] { annotationClass }, (proxy, method, args) -> {
Annotation annotation = (Annotation) proxy;
String methodName = method.getName();
switch (methodName) {
case "toString":
return AnnotationUtils.toString(annotation);
case "hashCode":
return AnnotationUtils.hashCode(annotation);
case "equals":
return AnnotationUtils.equals(annotation, (Annotation) args[0]);
case "annotationType":
return annotationClass;
default:
if (!properties.containsKey(methodName)) {
throw new NoSuchMethodException(String.format("Missing value for mocked annotation property '%s'. Pass the correct value in the 'properties' parameter", methodName));
}
return properties.get(methodName);
}
});
}
渡されたプロパティの型は、注釈インターフェイスで宣言された実際の型でチェックされず、欠落している値は実行時にのみ検出されます。
Tobias Liefke の回答のように内部 Java API を使用することの欠点がなく、kaqqao の回答(およびおそらくGunnar の回答) で言及されているコードと機能がかなり似ています。