CCBlueX Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    关于Nashorn JS引擎中Java的部分用法

    Chinese
    3
    4
    158
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • As丶One
      As丶One last edited by

      1、Java.type函数

      参数:

      Java类型的名称

      返回:

      表示该类型的对象(jdk.internal.dynalink.beans.StaticClass)

      说明:

      返回的对象是jdk.internal.dynalink.beans.StaticClass,你可以使用new操作符访问其构造函数,也可用直接访问其公开静态成员。

      例子:

      var System = Java.type("java.lang.System")
      System.out.println("Hello world!")
      //Hello world!
      
      var JDoubleArray = Java.type("double[]")
      var arr = new JDoubleArray(3)
      arr[0] = 0.5, arr[1] = 2.3, arr[2] = 3.14
      
      for each(i in arr) print(i)
      //0.5
      //2.3
      //3.14
      

      2、Java.from函数

      参数:

      Java数组或Collection

      返回:

      JavaScript数组

      说明:

      该函数会将Java数组或Collection转化为JavaScript数组

      例子:

      var JDoubleArray = Java.type("double[]")
      var arr = new JDoubleArray(3)
      arr[0] = 0.5, arr[1] = 2.3, arr[2] = 3.14
      
      print(arr)
      //[[email protected]
      print(arr instanceof Array)
      //false
      
      arr = Java.from(arr)
      
      print(arr)
      //0.5,2.3,3.14
      print(arr instanceof Array)
      //true
      

      3、Java.to函数

      参数:

      1、JavaScript对象(一般为数组)

      2、Java Collection或数组类型的 名称或者StaticClass

      返回:

      表示该类型的Java Collection或数组

      说明:

      该函数会将输入的对象转化为Java Collection或数组

      例子:

      var arr = [true, false, 3.14, null, "str"]
      
      print(arr)
      //true,false,3.14,,str
      
      arr = Java.to(arr,"int[]")
      
      for each(i in arr) print(i)
      //1
      //0
      //3
      //0
      //0
      

      4、Java.extend函数

      参数:

      1、要一个或者多个父类或接口

      2、重写函数对象(可省略)

      返回:

      指定Java类(或指定接口的实现)的子类的类型对象(jdk.internal.dynalink.beans.StaticClass)

      说明:

      要重写的函数必须是可被重写(即在Java中可用@Override修饰)的函数,Java.extend可以这种形式使用

      Java.extend(ArrayList){size: function() { print("size invoked!"); }}

      但这个是Nashorn JS引擎的特性,大部分JS引擎或者编辑器无法识别这种格式,这意味着如果需要使用一些工具对JS代码进行处理(如混淆)可能会出错,建议参照以下格式使用Java.extend。

      例子:

      var ArrayList = Java.type("java.util.ArrayList")
      
      var ArrayListExtender1 = Java.extend(ArrayList,{size: function() { print("size invoked!"); }})
      var ArrayListExtender2 = Java.extend(ArrayList,{size: function() { print("size invoked!"); return 3;}})
      
      var ExtendedArrayList1 = new ArrayListExtender1()
      var ExtendedArrayList2 = new ArrayListExtender2()
      
      print(ExtendedArrayList1.size())
      //size invoked!
      //0
      
      print(ExtendedArrayList2.size())
      //size invoked!
      //3
      

      5、Java.super函数

      参数:

      子类(jdk.internal.dynalink.beans.StaticClass)

      返回:

      父类(jdk.nashorn.internal.runtime.linker.JavaSuperAdapter)

      说明:

      当给定一个使用Java.extend()或等效机制(JS to Java Adapter),Java.super返回一个对象,可用于调用该对象的超类方法。

      例子:

      var ArrayList = Java.type("java.util.ArrayList")
      var ArrayListExtender = Java.extend(ArrayList,{size: function() { return 3;}})
      var ExtendedArrayList = new ArrayListExtender()
      var ArrayL1st = Java.super(ExtendedArrayList)
      
      print(ExtendedArrayList.size())
      //3
      print(ArrayL1st.size())
      //0
      

      参考文献:

      1、Nashorn NativeJava源代码

      2、官方文档

      Konoha Scarlet 1 Reply Last reply Reply Quote 0
      • Ali00035
        Ali00035 Banned last edited by Ali00035

        This post is deleted!
        1 Reply Last reply Reply Quote 0
        • Konoha Scarlet
          Konoha Scarlet @As丶One last edited by

          @as丶one said in 关于Nashorn JS引擎中Java的部分用法:
          Nashorn JS 里是不是所有的结尾Object({})型参数都能写到括号外面? function呢

          As丶One 1 Reply Last reply Reply Quote 0
          • As丶One
            As丶One @Konoha Scarlet last edited by

            @konoha-scarlet
            不是这样的,这个只是Java.extend的特殊用法

            1 Reply Last reply Reply Quote 0
            • First post
              Last post
            About
            • Terms of Service
            • Privacy Policy
            • Status
            • Contact Us
            Downloads
            • Releases
            • Source code
            • License
            Docs
            • Tutorials
            • CustomHUD
            • AutoSettings
            • ScriptAPI
            Community
            • Forum
            • Guilded
            • YouTube
            • Twitter
            • D.Tube