zoukankan      html  css  js  c++  java
  • 【JAVA SE基础篇】68.动态编译,脚本引擎,字节码操作

    1.动态编译

    1.介绍

    jdk1.6后引入动态编译机制

    应用场景:

      可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统

      服务器动态加载某些类文件进行编译

    两种方法:

      通过Runtime调用编译器,启动显得进程去操作

      通过JavaCompiler动态编译

      通过反射运行编译好的类

    2.通过JavaCompiler动态编译

    第一个null:为编译器提供参数

    第二个null:得到java编译器的输出信息

    第三个null:接受编译器的错误信息

    sourceFile:可变参数(String数组)能传入一个或多个java源文件的地址

    返回值:0代表编程成功,非0则编译失败

    3.通过反射运行编译好的类

    2.通过脚本引擎执行js代码

    JAVA脚本引擎是从JDK6.0之后添加的新功能。
    脚本引擎介绍:
    – 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从
    而达到在 Java 平台上调用各种脚本语言的目的。
    – Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。
    – 可以把一些复杂异变的业务逻辑交给脚本语言处理,这又大大提高了
    开发效率。

     3.字节码操作

    java动态性的两种常见实现方式:字节码操作和反射

    运行时操作字节码可以实现:动态生成新的类,动态改变某个类的结构(添加/删除/修改 新的属性/方法)

    优势:比反射开销小,性能高

    常见的字节码操作类库:1.BCEL,2.ASM,3.CGLIB,4.JAVASSIT

     javassist的最外层的api和java反射包中的api相似

    主要由CtClass,CtMethod,以及CtField几个类组成。

    用于执行和jdk反射api中java.lang,Class,java.lang,Method,java.lang,reflect.Method.Field相同的操作

    1.使用ssist库创建一个全新的类

    2.使用XJAD反编译工具,将生成的class文件反编译成JAVA文件

    4.javassist常见api

    5.javassist的局限性

    jdk5的新语法不支持(包括泛型、枚举),不支持注解修改,但可以通过底层javassist类来解决

    不支持数组的而初始化,除非数组的容量为1

    不支持内部类和匿名类

    不支持continue和break表达式

    对于继承关系有些不支持

    例:

    class A{}

    class B extends A{}

    class C extends B{}

  • 相关阅读:
    CF948D Perfect Security
    bzoj 1015 [JSOI2008]星球大战starwar
    XJOI 7191 Genius ACM
    bzoj 1491 [NOI2007]社交网络
    CF1066F Yet another 2D Walking
    iOS main函数讲解
    iOS 邓白氏编码的申请
    iOS 开发与H5交互(JavaScriptCore框架的使用)
    iOS 开发之RunLoop
    iOS 蓝牙开发之(CoreBlueTooth)
  • 原文地址:https://www.cnblogs.com/chengkuan/p/13427903.html
Copyright © 2011-2022 走看看