乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入了解ASM

       hmtomyang 2012-03-30
      三、ASM
      我們知道Java是靜態(tài)語言,而python、ruby是動態(tài)語言,Java程序一旦寫好很難在運行時更改類的行為,而python、ruby可以。
      不過基于bytecode層面上我們可以做一些手腳,來使Java程序多一些靈活性和Magic,ASM就是這樣一個應(yīng)用廣泛的開源庫。

      ASM is a Java bytecode manipulation framework. It can be used to dynamically generate stub classes or other proxy classes,
      directly in binary form, or to dynamically modify classes at load time, i.e., just before they are loaded into the Java
      Virtual Machine.

      ASM完成了BCELSERP同樣的功能,但ASM
      只有30多k,而后兩者分別是350k和150k。apache真是越來越過氣了。

      讓我們來看一個ASM的簡單例子Helloworld.java,它生成一個Example類和一個main方法,main方法打印"Hello world!"語句:
      Java代碼 復(fù)制代碼 收藏代碼
      1. import java.io.FileOutputStream;  
      2. import java.io.PrintStream;  
      3.   
      4. import org.objectweb.asm.ClassWriter;  
      5. import org.objectweb.asm.MethodVisitor;  
      6. import org.objectweb.asm.Opcodes;  
      7. import org.objectweb.asm.Type;  
      8. import org.objectweb.asm.commons.GeneratorAdapter;  
      9. import org.objectweb.asm.commons.Method;  
      10.   
      11. public class Helloworld extends ClassLoader implements Opcodes {  
      12.   
      13.   public static void main(final String args[]) throws Exception {  
      14.   
      15.     // creates a ClassWriter for the Example public class,  
      16.     // which inherits from Object  
      17.   
      18.     ClassWriter cw = new ClassWriter(0);  
      19.     cw.visit(V1_1, ACC_PUBLIC, "Example"null"java/lang/Object"null);  
      20.     MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>""()V"null,  
      21.         null);  
      22.     mw.visitVarInsn(ALOAD, 0);  
      23.     mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object""<init>""()V");  
      24.     mw.visitInsn(RETURN);  
      25.     mw.visitMaxs(11);  
      26.     mw.visitEnd();  
      27.     mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main",  
      28.         "([Ljava/lang/String;)V"nullnull);  
      29.     mw.visitFieldInsn(GETSTATIC, "java/lang/System""out",  
      30.         "Ljava/io/PrintStream;");  
      31.     mw.visitLdcInsn("Hello world!");  
      32.     mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream""println",  
      33.         "(Ljava/lang/String;)V");  
      34.     mw.visitInsn(RETURN);  
      35.     mw.visitMaxs(22);  
      36.     mw.visitEnd();  
      37.     byte[] code = cw.toByteArray();  
      38.     FileOutputStream fos = new FileOutputStream("Example.class");  
      39.     fos.write(code);  
      40.     fos.close();  
      41.     Helloworld loader = new Helloworld();  
      42.     Class exampleClass = loader  
      43.         .defineClass("Example", code, 0, code.length);  
      44.     exampleClass.getMethods()[0].invoke(nullnew Object[] { null });  
      45.   
      46.     // ------------------------------------------------------------------------  
      47.     // Same example with a GeneratorAdapter (more convenient but slower)  
      48.     // ------------------------------------------------------------------------  
      49.   
      50.     cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);  
      51.     cw.visit(V1_1, ACC_PUBLIC, "Example"null"java/lang/Object"null);  
      52.     Method m = Method.getMethod("void <init> ()");  
      53.     GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, nullnull,  
      54.         cw);  
      55.     mg.loadThis();  
      56.     mg.invokeConstructor(Type.getType(Object.class), m);  
      57.     mg.returnValue();  
      58.     mg.endMethod();  
      59.     m = Method.getMethod("void main (String[])");  
      60.     mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, nullnull, cw);  
      61.     mg.getStatic(Type.getType(System.class), "out", Type  
      62.         .getType(PrintStream.class));  
      63.     mg.push("Hello world!");  
      64.     mg.invokeVirtual(Type.getType(PrintStream.class), Method  
      65.         .getMethod("void println (String)"));  
      66.     mg.returnValue();  
      67.     mg.endMethod();  
      68.     cw.visitEnd();  
      69.     code = cw.toByteArray();  
      70.     loader = new Helloworld();  
      71.     exampleClass = loader.defineClass("Example", code, 0, code.length);  
      72.     exampleClass.getMethods()[0].invoke(nullnew Object[] { null });  
      73.   }  
      74. }  

      我們看到上面的例子分別使用ASM的MethodVisitor和GeneratorAdapter兩種方式來動態(tài)生成Example類并調(diào)用打印語句。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多