View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
5    */
6   package mockit.internal.reflection;
7   
8   import static mockit.internal.reflection.ParameterReflection.NO_PARAMETERS;
9   
10  import edu.umd.cs.findbugs.annotations.NonNull;
11  import edu.umd.cs.findbugs.annotations.Nullable;
12  
13  import java.lang.reflect.InvocationTargetException;
14  import java.lang.reflect.Method;
15  
16  public final class AnnotationReflection {
17      private AnnotationReflection() {
18      }
19  
20      @NonNull
21      public static String readAnnotationAttribute(@NonNull Object annotationInstance, @NonNull String attributeName) {
22          try {
23              return readAttribute(annotationInstance, attributeName);
24          } catch (NoSuchMethodException e) {
25              throw new RuntimeException(e);
26          }
27      }
28  
29      @Nullable
30      public static String readAnnotationAttributeIfAvailable(@NonNull Object annotationInstance,
31              @NonNull String attributeName) {
32          try {
33              return readAttribute(annotationInstance, attributeName);
34          } catch (NoSuchMethodException e) {
35              return null;
36          }
37      }
38  
39      @NonNull
40      private static String readAttribute(@NonNull Object annotationInstance, @NonNull String attributeName)
41              throws NoSuchMethodException {
42          try {
43              Method publicMethod = annotationInstance.getClass().getMethod(attributeName, NO_PARAMETERS);
44              return (String) publicMethod.invoke(annotationInstance);
45          } catch (IllegalAccessException | InvocationTargetException e) {
46              throw new RuntimeException(e instanceof InvocationTargetException ? e.getCause() : e);
47          }
48      }
49  }