1 先反编译,然后改java程序2 或者另写一个class,去继承他,然后扩充!

解决方案 »

  1.   

    谢谢楼上这为大哥 我想指的就是针对一个已经编辑好的class文件 而在里面添加代码
      

  2.   

    先否定你的标题然后再解答你的问题:
    相对简单一点的做法,你可以用AOP;复杂一点的做法,当然自由发挥的余地更大,你可以用java汇编。
    解答完毕!
      

  3.   

    如果有兴趣学后者,不妨先熟悉一下javap命令
      

  4.   

    反编译后还是java代码,然后改java程序
      

  5.   

    学学虚拟机规范,反汇编javac看看汇编,或者我感觉eclipse好像不用javac编译java文件,而是自己生成class文件,你可以看看eclipse的源代码。GCJ不是也有源代码的么
      

  6.   

    如果你對Java規範中class文件格式已經精通了,你也可以自己寫修改class的二進制流文件内容
      

  7.   

    如果你對Java規範中class文件格式已經精通了,你也可以自己寫修改class的二進制流文件内容
    -----
      

  8.   

    还是来点实际的。如果你对JVM指令了解,那么下面的代码应该是有亲切感的:
            /*
            for(int mm=0;mm<9;mm++){
                System.out.println(mm+"--okok");
            }
            */
            Label ml01 = new Label();
            Label ml02 = new Label();
            forInsn(ICONST_0);
            forVarInsn(ISTORE, 4);
            forLabel(ml01);
            forVarInsn(ILOAD, 4);
            forIntInsn(BIPUSH, 9);
            forJumpInsn(IF_ICMPGE, ml02);
            forFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
            forTypeInsn(NEW, "java/lang/StringBuffer");
            forInsn(DUP);
            forMethodInsn(INVOKESPECIAL, "java/lang/StringBuffer", "<init>", "()V");
            forVarInsn(ILOAD, 4);
            forMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append", "(I)Ljava/lang/StringBuffer;");
            forLdcInsn("--okok");
            forMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
            forMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;");
            forMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
            forIincInsn(4, 1);
            forJumpInsn(GOTO, ml01);
            forLabel(ml02);
      

  9.   

    我曾经让代码自己生成一个java文件,然后编译,运行,整个过程jvm都没有停哦好象jdk1。3以上就可以了楼主的想法倒是没试过,不知道可不可以
      

  10.   

    使用javaassist/cglib等代码增强的工具
    详情请google之,因为我也不会
      

  11.   

    zcjl()应该来点实际的嘛
    呵呵
      

  12.   

    实际的也有啊,hibernate的po就是通过cglib来增强的
    有兴趣的可以去看看hb的src嘛
      

  13.   

    而IBM DW上也有介绍使用javaassist的文章
      

  14.   

    package sample;import javassist.*;/*
       A very simple sample program   This program overwrites sample/Test.class (the class file of this
       class itself) for adding a method g().  If the method g() is not
       defined in class Test, then this program adds a copy of
       f() to the class Test with name g().  Otherwise, this program does
       not modify sample/Test.class at all.   To see the modified class definition, execute:   % javap sample.Test   after running this program.
    */
    public class Test {
        public int f(int i) {
    return i + 1;
        }    public static void main(String[] args) throws Exception {
    ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get("sample.Test");
    try {
        cc.getDeclaredMethod("g");
        System.out.println("g() is already defined in sample.Test.");
    }
    catch (NotFoundException e) {
        /* getDeclaredMethod() throws an exception if g()
         * is not defined in sample.Test.
         */
        CtMethod fMethod = cc.getDeclaredMethod("f");
        CtMethod gMethod = CtNewMethod.copy(fMethod, "g", cc, null);
        cc.addMethod(gMethod);
        cc.writeFile(); // update the class file
        System.out.println("g() was added.");
    }
        }
    }去下载一个javassist来,玩了一下这个Test,很不错的说
      

  15.   

    cglib, Hibernate用这个修改字节码, 也就是Class.
    另外Apache有BECL, 也可以
      

  16.   

    据我所知,JDO就是对字节码进行增强实现的。