比如我写了一个程序叫A,另外有任意的一个java 程序,比如叫App,
我希望自己的程序A在JVM启动时能自动运行,从而可以监控App的 运行情况,请问怎么办?因为资料比较少,懂的人估计不多哦 !而且A和 App要在同一个JVM里运行

解决方案 »

  1.   

    利用Socket连接,不知道如何?
      

  2.   

    既然事A去监控APP,为什么一定要jvm启动的时候就加载A
    让APP启动的时候加载A不就ok了
      

  3.   

    每一个JAVA程序运行既是一个JVM
    LZ对JVM的理解有误 
    实现LZ的想法只能每个JAVA程序都要写入调用您写的类A了。
    建议LZ看下《深入JAVA虚拟机》
      

  4.   

    楼上的方法学习周期太长了。
    把你的默认java.exe(或者linux下的java)改名,然后写一个同名的批处理文件(或者shell脚本),叫做java.bat(或者java)。
      

  5.   

    楼主去看一下JVMPI相关资料,应该是有接口留给你的,不过启动的时候可能就不能用java启动了。或者去eclipse.org上看看tptp这个项目吧。基本上这个已经超出了java语言的范围了,看深入java虚拟机也没用。
      

  6.   

    可以的。 在公共入口的类中调用 
    static{
        System.getruntime.exec("A.exe")
    }或者使用bat
      

  7.   

    看来是不可能了?
    总结一下,
    1 每个JVM就是一个进程,并不意味着只能在一个JVM里运行一个程序,比如JVMPI就是另一个在JVM里运行的程序,不过不是java程序
    2 如果要让自己的java程序在每个JVM实例运行时自动装载,就必须要JVM支持,但JVM是否以某种比如JVMPI的机制支持这种类装载还不清楚。
    3 我想做的实际上是一个通用的程序,对所有的java程序都能起作用(就是说随便给我个字节码的java程序,我的程序都能对它起作用),所以,象static{
    System.getruntime.exec("A.exe")
    }
    类似的解决办法是不适用的
    继续研究中,等待进一步结论
      

  8.   

    不知道我的理解对不对,把A(假设为可执行文件)的文件尾部附加java.exe,同时把这个捆绑程序命名为java.exe,执行时肯定先执行A,再把java.exe通过流的形式作为文件分离出来,关闭A(为了重命名文件),新开进程执行java.exe(环境变量可能是难题),新开进程监控java.exe...
      

  9.   

    各位,我找到解决办法了,用java5新增的instrument包里的premain函数,
    java -javaagent:myjar.jar App
    1.写一个AAA类,其中有一个public static void premain(Instrument inst, ...)(第二个参数忘记了)
    2.把该AAA类打包成myjar.jar, jar里的manifest文件必须有一条PreMain-Class: AAA
    3.java -javaagent:myjar.jar App这样,在执行App的main函数之前就会先执行premain函数,所以,想做什么事都可以写在premain函数里
      

  10.   

    LZ那要不是控制台程序 没有MAIN函数怎么办?
      

  11.   

    没有main函数?是在容器里跑的程序吗?那就只能把App换成你的容器的程序了。具体我没尝试过。你这么多星,不会这个都不明白吧,也许是我不明白你的意思
      

  12.   

    给你一个正解吧:用java assistive technology, 可以做出来一个类似windows平台的spy++工具。