docs: public static void main(String[] args) {
  
          if (args == null || args.length == 0 || args.length != 3) {
              throw new RuntimeException(printUsage());
          }
  
          final File outputPath = new File(args[0] + File.separator + "temp");
          try {
              FileUtils.deleteDirectory(outputPath);
          } catch (Exception e) {
              // dummy exception
          }
          outputPath.mkdirs();
  
          JDKCompilerHelper.setCompiler(new JdkCompiler(Thread.currentThread().getContextClassLoader()));
  
          final String filterClassPackage = args[2];
          if (filterClassPackage == null) {
              return;
          }
  
          final String[] split = filterClassPackage.split(MULTI_PKG_SPLIT);
  
          ClassScanner scanner = new ClassScanner() {
  
              @Override
              protected void onEntry(EntryData entryData) throws Exception {
                  String name = entryData.getName();
                  if (!isStartWith(name, split)) {
                      return;
                  }
  
                  Class c = getByClass(name);
                  if (c == null) {
                      return;
                  }
  
                  try {
                      List<Field> fields = FieldUtils.findMatchedFields(c, Protobuf.class);
                      if (!fields.isEmpty()) {
                          ProtobufProxy.create(c, false, outputPath);
                      }
                  } catch (Throwable e) {
                      throw new Exception(e.getMessage(), e);
                  }
              }
          };
  
          scanner.scanDefaultClasspath();
  
          // copy files
          try {
              FileUtils.copyDirectory(outputPath, new File(args[1]));
          } catch (IOException e) {
          }
  
      }