我解释一下:
比如我写了一个程序,运行了。然后我不小心把这个程序代码删除了,硬盘里没有了,删除以后就后悔了,还想要,此时没有备份,但是正在执行的程序还没有结束,说明还有一个class加载到jvm里运行,我想再写另外一个程序,从内存中把我刚才不小心删除的程序且现在正在运行的程序反向摘取下来,有没有可能,那另外一个程序该怎么写?

解决方案 »

  1.   

    1 从原理上讲,应该是可以的。他们也是运行的class,肯定在内存的某个位置。 我不知道 C/C++能否搜索内存找到。呵呵!2 我简单的查了一下资料 JVM的一个API也许可以达到你的要求
    http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html里面有dump部分。也许能把你要的对象dump出来!
    3 你删除的是java文件,你应该还有.class文件吧,哪怕是一个稍老版本都可以。可以反编译出来啊!
    我没有做过这个研究,不能提供你更多的帮助了。
      

  2.   

    jvm可以反编译..不过只能显示方法/变量...里面东西还要自己加...楼主那种情况...直接用FinalRecovery/HandyRecovery/EasyRecovery都应该能直接恢复了
      

  3.   

    我就是想问“有没有办法将jvm中加载并执行的class序列化到本地”,我只不过举了个将jvm中加载并执行的class序列化到本地的场景而已,可能真实情况有很多,比如说某个class根本没在本地存储过,而是在jvm中临时产生临时消除,或者某个class是从远程直接加载到客户端内存中运行的,这些在客户端硬盘里拿不到class文件,但是却真实在客户端机器上运行,我在找一个能得到它们的办法。java io 里面有没有接口?
      

  4.   

    EasyRecovery别琢磨ClassLoader了,省省力气吧 
      

  5.   


    这样啊....有class的话,javap反编译就行了...
    java的安全性挺高的,不容易直接从内存得到东西,内存的东西都是class经过jvm封装放到里面的.
      

  6.   


    说的很正确,有工具的,你试试EasyRecovery。
      

  7.   

    那也就是说,内存里的其他东西,比如某个变量值什么的,也可取摘取到本地?有些变量涉及到安全问题,可能不会再客户端本地存储,在内存中需要的时候动态产生动态消失来保证这个关键数据不被泄密,只要用javap工具就能把它拿到阿?
      

  8.   

    javap是反编译类用的,不能够拿到本地数据...只是给出这个类的大致信息运行javap Welcome 可以看到他的父类,构造类,及方法.看不到他的变量Compiled from "Welcome.java"
    public class Welcome extends java.lang.Object{
        public Welcome();
        public static void main(java.lang.String[]);
    }运行javap -c Welcome 可以看到他的反汇编信息...但愿你能看懂...反正我是一知半解Compiled from "Welcome.java"
    public class Welcome extends java.lang.Object{
    public Welcome();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   returnpublic static void main(java.lang.String[]);
      Code:
       0:   iconst_4
       1:   istore_1
       2:   iconst_5
       3:   istore_2
       4:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       7:   iload_1
       8:   invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
       11:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       14:  iload_2
       15:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
       18:  return}原程序
    public class Welcome
    {
    public static void main(String[] args)
    {
    // System.out.println(3!=5);
    // System.out.println(5!=5);
    int a=4;
    int b=5;
    //
    System.out.println(a);
    System.out.println(b);
    }}如果你想通过class得到java源文件...那么你得先能看得懂反汇编那些信息...我做不到...
      

  9.   

    查看JVM的命令吧,但完全序列化比较难,首先分两部,序列化为class文件,然后再反编译至java
    或者你看看ASM