Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

LiquidBounce Forum

  1. Home
  2. Chinese
  3. 关于Nashorn JS引擎中Java的部分用法

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

Scheduled Pinned Locked Moved Chinese
4 Posts 3 Posters 1.3k Views 1 Watching
  • 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丶OneA Offline
    As丶OneA Offline
    As丶One
    wrote on last edited by
    #1

    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)
    //[D@20d28811
    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 ScarletK 1 Reply Last reply
    0
    • Ali00035A Offline
      Ali00035A Offline
      Ali00035
      wrote on last edited by Ali00035
      #2
      This post is deleted!
      1 Reply Last reply
      0
      • As丶OneA As丶One

        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)
        //[D@20d28811
        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 ScarletK Offline
        Konoha ScarletK Offline
        Konoha Scarlet
        wrote on last edited by
        #3

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

        As丶OneA 1 Reply Last reply
        0
        • Konoha ScarletK Konoha Scarlet

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

          As丶OneA Offline
          As丶OneA Offline
          As丶One
          wrote on last edited by
          #4

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

          1 Reply Last reply
          0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          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
          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups