code: package org.gridkit.jvmtool.bstub;
  
  import java.io.File;
  import java.io.IOException;
  import java.util.Map;
  
  import org.gridkit.jvmtool.cli.CommandLauncher;
  import org.gridkit.lab.jvm.perfdata.JStatData;
  import org.gridkit.lab.jvm.perfdata.JStatData.Counter;
  import org.gridkit.lab.jvm.perfdata.JStatData.StringCounter;
  
  import com.beust.jcommander.Parameter;
  import com.beust.jcommander.Parameters;
  import com.beust.jcommander.ParametersDelegate;
  
  import net.java.btrace.client.Client;
  
  @Parameters(commandDescription = "Stub probe to target process")
  public class StubCommand implements Runnable {
  
      @ParametersDelegate
      private final CommandLauncher host;
      
      @ParametersDelegate
      private BTraceClientConnection bconn;
      
      @Parameter(names = {"-s", "--script"}, description = "Script class file", required = true)
      private String script;
  
      @Parameter(names = {"-a", "--args"}, variableArity = true, description = "Script arguments", required = false)
      private String[] args;
      
      public StubCommand(CommandLauncher host) {
          this.host = host;
          this.bconn = new BTraceClientConnection(host);
      }
  
      @Override
      public void run() {
          try {
              int pid = bconn.getPID();
              System.out.println("Target JVM " + pid);
              try {
                  Map<String, Counter<?>> data = JStatData.connect(pid).getAllCounters();
                  String vm_name = ((StringCounter)data.get("java.property.java.vm.name")).getString();
                  String vm_java_version = ((StringCounter)data.get("java.property.java.version")).getString();
                  String vm_info = ((StringCounter)data.get("java.property.java.vm.info")).getString();
                  String vm_version = ((StringCounter)data.get("java.property.java.vm.version")).getString();
                  System.out.println(vm_name);
                  System.out.println(vm_java_version + "  " + vm_info + "  " + vm_version);
              }
              catch(Exception e) {
                  System.out.println("JVM info is not available (" + e.toString() + ")");
              }
  
              File f = new File(script);
              if (!f.isFile()) {
                  host.fail("No such file [" + f.getCanonicalPath() + "]");
              }
  
              Client client = bconn.connect();
              byte[] data = StreamHelper.readFile(f);
              
              client.submit(f.getName(), data, args);
              
              System.out.println("Press any key to exit");
              System.in.read();
              
          } catch (IOException e) {
              host.fail("", e);
          }
      }
  }
  