Proxies

[a] [new] proxy [instance] of %javatypes% (using|from) %objects%

The first argument (%javatypes%) is a list of imported interfaces (whether a class is an interface can be found on the javadoc).

The second argument is an indexed list variable, with each element in the form {list::%method name%} = %function/section%. %method name% is the name of one of the methods from one of the interfaces. %function/section% is either a function reference or a section.

Function wrappers can be created with the following syntax.

[the] function(s| [reference[s]]) %strings% [called with [[the] [arg[ument][s]]] %-objects%]

The first argument (%strings%) is the name of the function you want to reference. This is enough for the function reference to be completed, but you can also add some argument values.

When a method from the proxy is ran, it is passed on to the function/section corresponding to the method name. The arguments are defined in the following way: 1. The argument values specified in the function reference (if there are any) (only if this method doesn't redirect to a section) 2. The proxy instance object itself. 3. The argument values from the method call.

Here's an example to help you understand it:

import:
    org.bukkit.Bukkit
    ch.njol.skript.Skript
    java.lang.Runnable

function do_something():
    broadcast "It does something!"

command /proxy:
    trigger:
        # As you can see on https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
        # the Runnable interface has one method: run
        set {_functions::run} to function reference "do_something"
        set {_proxy} to new proxy instance of Runnable using {_functions::*}
        {_proxy}.run() # will broadcast 'It does something!'
        Bukkit.getScheduler().runTask(Skript.getInstance(), {_proxy}) # also broadcasts 'It does something!'

Class proxies are most useful for more interaction with Java code, for example when methods require some implementation of an interface.

Last updated