M8Test Help

访问 JVM

访问 Java 类

创建 Java 对象

let StringBuilder = $java.loadClass("java.lang.StringBuilder") $console.log(new StringBuilder("Hello World"))
local StringBuilder = _java:loadClass("java.lang.StringBuilder") _console:log(StringBuilder("Hello World"))
<?php // 通过 java(类名,构造方法参数) 创建对象 $a = java("java.util.Date", 123); $console->log($a->time);
StringBuilder = _java.loadClass("java.lang.StringBuilder") _console.log(StringBuilder("Hello World"))
StringBuilder = java.lang.StringBuilder $console.log(StringBuilder.new("Hello World"))

调用 Java 对象方法

val sb = StringBuilder("Hello World") sb.append(",kotlin!") _console.log(sb.toString())
def sb = new StringBuilder("Hello World") sb.append(",groovy!") $console.log(sb.toString())
let StringBuilder = $java.loadClass("java.lang.StringBuilder") let sb = new StringBuilder("Hello World") sb.append(",js!") $console.log(sb.toString())
local StringBuilder = _java:loadClass("java.lang.StringBuilder") local sb = StringBuilder("Hello World") sb:append(",lua!") _console:log(sb:toString())
<?php $sb = java("java.lang.StringBuilder", "Hello World"); $sb->append(",php!"); $console->log($sb->toString());
StringBuilder = _java.loadClass("java.lang.StringBuilder") sb = StringBuilder("Hello World") sb.append(",python!") _console.log(sb.toString())
StringBuilder = java.lang.StringBuilder sb = StringBuilder.new("Hello World") sb.append(",ruby!") $console.log(sb.toString())

调用 Java 对象属性

import com.m8test.script.core.impl.JavaTypeTester _console.log(JavaTypeTester().OBJECT_FIELD)
import com.m8test.script.core.impl.JavaTypeTester $console.log(new JavaTypeTester().OBJECT_FIELD)
let JavaTypeTester = $java.loadClass("com.m8test.script.core.impl.JavaTypeTester") $console.log(new JavaTypeTester().OBJECT_FIELD)
local JavaTypeTester = _java:loadClass("com.m8test.script.core.impl.JavaTypeTester") _console:log(JavaTypeTester().OBJECT_FIELD)
<?php $a = java("com.m8test.script.core.impl.JavaTypeTester"); $console->log($a->OBJECT_FIELD);
JavaTypeTester = _java.loadClass("com.m8test.script.core.impl.JavaTypeTester") _console.log(JavaTypeTester().OBJECT_FIELD)
java_import "com.m8test.script.core.impl.JavaTypeTester" jtt = JavaTypeTester.new $console.log(jtt.OBJECT_FIELD)

调用 Java 静态方法

let System = $java.loadClass("java.lang.System") $console.log(System.currentTimeMillis())
local System = _java:loadClass("java.lang.System") _console:log(System:currentTimeMillis())
<?php // 方法二: java_class() 方法导入类后通过 -> 调用 $class = java_class("java.lang.System"); //# System.currentTimeMillis(); $console->log($class->currentTimeMillis()); $console->log($class::currentTimeMillis());
System = _java.loadClass("java.lang.System") _console.log(System.currentTimeMillis())

调用 Java 静态属性

import com.m8test.script.core.impl.JavaTypeTester _console.log(JavaTypeTester.STATIC_FIELD)
import com.m8test.script.core.impl.JavaTypeTester $console.log(JavaTypeTester.STATIC_FIELD)
let JavaTypeTester = $java.loadClass("com.m8test.script.core.impl.JavaTypeTester") $console.log(JavaTypeTester.STATIC_FIELD)
local JavaTypeTester = _java:loadClass("com.m8test.script.core.impl.JavaTypeTester") _console:log(JavaTypeTester.STATIC_FIELD)
<?php $class = java_class("java.lang.System"); # System.in 静态常量 $in = $class::in; $console->log(gettype($in)); $JavaTypeTester = java_class("com.m8test.script.core.impl.JavaTypeTester"); // 静态变量, 反射调用 $v = $reflectors->reflect($JavaTypeTester)->getField(null, function ($f) { $f->setName("STATIC_FIELD"); }); $console->log(gettype($v));
JavaTypeTester = _java.loadClass("com.m8test.script.core.impl.JavaTypeTester") _console.log(JavaTypeTester.STATIC_FIELD)
java_import "com.m8test.script.core.impl.JavaTypeTester" $console.log(JavaTypeTester.STATIC_FIELD) java_import "android.os.Build" $console.log(Build::BRAND)

实现 Java 非功能性接口

import com.m8test.script.core.api.console.Console import com.m8test.script.core.impl.JavaTypeTester class MultiAbstractMethodInterfaceImpl(private val _console: Console) : JavaTypeTester.MultiAbstractMethodInterface { override fun setInt(i: Int) { _console.log("setInt $i") } override fun getInt(): Int { _console.log("getInt") return 0 } } JavaTypeTester.setMultiAbstractMethodInterface(MultiAbstractMethodInterfaceImpl(_console)) val mami = JavaTypeTester.getMultiAbstractMethodInterface() mami.setInt(1234) _console.log(mami.getInt())
import com.m8test.script.core.impl.JavaTypeTester class MultiAbstractMethodInterfaceImpl implements JavaTypeTester.MultiAbstractMethodInterface { def $console @Override void setInt(int i) { $console.log("setInt" + i) } @Override int getInt() { $console.log("getInt") return 0 } } JavaTypeTester.setMultiAbstractMethodInterface(new MultiAbstractMethodInterfaceImpl($console: $console)) def mami = JavaTypeTester.getMultiAbstractMethodInterface() mami.setInt(1234) $console.log(mami.getInt())
let JavaTypeTester = $java.loadClass("com.m8test.script.core.impl.JavaTypeTester") JavaTypeTester.setMultiAbstractMethodInterface({ setInt: (i) => { $console.log("setInt" + i) }, getInt: () => { $console.log("getInt") return 0 } }) let mami = JavaTypeTester.getMultiAbstractMethodInterface() mami.setInt(1234) $console.log(mami.getInt())
local JavaTypeTester = _java:loadClass("com.m8test.script.core.impl.JavaTypeTester") JavaTypeTester:setMultiAbstractMethodInterface({ setInt = function(i) _console:log("setInt" .. i) end, getInt = function() _console:log("getInt") return 0 end }) local mami = JavaTypeTester:getMultiAbstractMethodInterface() mami:setInt(1234) _console:log(mami:getInt())
<?php $JavaTypeTester = java_class("com.m8test.script.core.impl.JavaTypeTester"); class MultiAbstractMethodInterfaceImpl { var $console; var $i; function __construct($p) { $this->console = $p; } function setInt($i) { $this->i = $i; $this->console->log("setInt", $i); } function getInt() { return $this->i; } } $JavaTypeTester->setMultiAbstractMethodInterface(new MultiAbstractMethodInterfaceImpl($console)); $mami = $JavaTypeTester->getMultiAbstractMethodInterface(); $mami->setInt(12345); $console->log($mami->getInt());
JavaTypeTester = _java.loadClass("com.m8test.script.core.impl.JavaTypeTester") class MultiAbstractMethodInterfaceImpl(): def setInt(self, i): _console.log("setInt " + str(i)) def getInt(self): _console.log("getInt") return 0 JavaTypeTester.setMultiAbstractMethodInterface(_java.proxy(MultiAbstractMethodInterfaceImpl(), [ "com.m8test.script.core.impl.JavaTypeTester$MultiAbstractMethodInterface"])) mami = JavaTypeTester.getMultiAbstractMethodInterface() mami.setInt(1234) _console.log(mami.getInt())
import 'com.m8test.script.core.impl.JavaTypeTester' import 'com.m8test.script.core.impl.JavaTypeTester$MultiAbstractMethodInterface' class MultiAbstractMethodInterfaceImpl include MultiAbstractMethodInterface def setInt(i) $console.log("setInt #{i}") end def getInt() $console.log("getInt") 0 end end JavaTypeTester.setMultiAbstractMethodInterface(MultiAbstractMethodInterfaceImpl.new) mami = JavaTypeTester.getMultiAbstractMethodInterface() mami.setInt(1234) $console.log(mami.getInt())

实现 Java 功能性接口

import com.m8test.script.core.api.console.Console import com.m8test.script.core.impl.JavaTypeTester class SingleAbstractMethodInterfaceImpl(private val _console: Console) : JavaTypeTester.SingleAbstractMethodInterface { override fun getInt(): Int { _console.log("getInt") return 0 } } JavaTypeTester.setSingleAbstractMethodInterface(SingleAbstractMethodInterfaceImpl(_console)) val sami = JavaTypeTester.getSingleAbstractMethodInterface() _console.log(sami.getInt())
import com.m8test.script.core.impl.JavaTypeTester class SingleAbstractMethodInterfaceImpl implements JavaTypeTester.SingleAbstractMethodInterface { def $console @Override int getInt() { $console.log("getInt") return 0 } } JavaTypeTester.setSingleAbstractMethodInterface(new SingleAbstractMethodInterfaceImpl($console: $console)) def sami = JavaTypeTester.getSingleAbstractMethodInterface() $console.log(sami.getInt())
let JavaTypeTester = $java.loadClass("com.m8test.script.core.impl.JavaTypeTester") JavaTypeTester.setSingleAbstractMethodInterface(() => { $console.log("getInt") return 0 }) let sami = JavaTypeTester.getSingleAbstractMethodInterface() $console.log(sami.getInt())
local JavaTypeTester = _java:loadClass("com.m8test.script.core.impl.JavaTypeTester") JavaTypeTester:setSingleAbstractMethodInterface(function() _console:log("getInt") return 0 end) local sami = JavaTypeTester:getSingleAbstractMethodInterface() _console:log(sami:getInt())
<?php $JavaTypeTester = java_class("com.m8test.script.core.impl.JavaTypeTester"); // 方法一: 通过闭包(推荐) $JavaTypeTester->setSingleAbstractMethodInterface(function () use ($console) { $console->log("closure"); return 1234; }); $sami = $JavaTypeTester->getSingleAbstractMethodInterface(); $console->log($sami->getInt()); // 方法二: 通过对象 class SingleAbstractMethodInterfaceImpl { var $console; function __construct($p) { $this->console = $p; } function getInt() { $this->console->log("getInt"); return 0; } } $JavaTypeTester->setSingleAbstractMethodInterface(new SingleAbstractMethodInterfaceImpl($console)); $sami = $JavaTypeTester->getSingleAbstractMethodInterface(); $console->log($sami->getInt());
JavaTypeTester = _java.loadClass("com.m8test.script.core.impl.JavaTypeTester") def sami(): _console.log("getInt") return 0 JavaTypeTester.setSingleAbstractMethodInterface(sami) s = JavaTypeTester.getSingleAbstractMethodInterface() _console.log(s == sami) _console.log(s())
import 'com.m8test.script.core.impl.JavaTypeTester' JavaTypeTester.setMultiAbstractMethodInterface { $console.log("getInt") 0 } sami = JavaTypeTester.getMultiAbstractMethodInterface() $console.log(sami.getInt())
Last modified: 08 August 2025