@Nullable String getAnnotationPattern(String annotationClassName) {
    if (!myAnnotationPatterns.containsKey(annotationClassName)) {
      myAnnotationPatterns.put(annotationClassName, null);

      try (InputStream is = myClassFinder.getClassBytesAsStream(annotationClassName)) {
        if (is != null) {
          new ClassReader(is).accept(new ClassVisitor(Opcodes.API_VERSION) {
            @Override
            public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
              boolean matches = myPatternAnnotationClassName.equals(Type.getType(desc).getClassName());
              return !matches ? null : new AnnotationVisitor(Opcodes.API_VERSION) {
                @Override
                public void visit(String name, Object value) {
                  if ("value".equals(name) && value instanceof String) {
                    myAnnotationPatterns.put(annotationClassName, (String)value);
                  }
                }
              };
            }
          }, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
        }
      }
      catch (IOException e) {
        Logger.getInstance(PatternInstrumenter.class).info("failed to read " + annotationClassName, e);
      }
    }

    return myAnnotationPatterns.get(annotationClassName);
  }
@Nullable String getAnnotationPattern(String annotationClassName)