Plugin-Erstellung/Java/Reflexion in Java: Unterschied zwischen den Versionen

Aus Rising World Wiki
Zeile 18: Zeile 18:
== Beispiel ==
== Beispiel ==
=== MethodCaller Klasse ===
=== MethodCaller Klasse ===
Beispiel für eine MethodCaller Klasse
Beispiel für eine einfache MethodCaller Klasse
<syntaxhighlight lang="java" line start="1">
<syntaxhighlight lang="java" line start="1">
// ...  
import java.lang.reflect.Method;
 
public class MethodCaller
{
    public void startMethod(String methodName) throws Exception
{
        // Holen Sie sich die Klasse, in der die Methode definiert ist
        Class<?> targetClass = this.getClass();
 
        // Holen Sie sich die Methode basierend auf dem Namen
        Method method = targetClass.getDeclaredMethod(methodName);
 
        // Rufe die Methode auf
        method.invoke(this);
    }
 
    public void method1()
{
        System.out.println("Methode 1 wurde aufgerufen");
    }
 
    public void method2()
{
        System.out.println("Methode 2 wurde aufgerufen");
    }
 
}
</syntaxhighlight>
</syntaxhighlight>



Version vom 8. Mai 2024, 12:30 Uhr

Reflexion ist eine leistungsstarke Funktion in Java, die es ermöglicht, zur Laufzeit auf Klassen, Methoden und Felder zuzugreifen und diese zu manipulieren. In diesem Artikel werden die Grundlagen der Reflexion in Java erläutert, insbesondere im Kontext von Plugins für das Spiel Rising World.


Grundlagen der Reflexion

Reflexion in Java ermöglicht es, zur Laufzeit auf die Struktur, Methoden und das Verhalten von Klassen zuzugreifen, ohne dass deren Namen zur Compilezeit bekannt sein müssen. Dies bietet eine flexible Möglichkeit, Klassen dynamisch zu untersuchen ...


Import

Es muss zuerst das folgende Paket importieren verwenden, um die Reflexions-API zu verwenden.

  • import java.lang.reflect.* - es importiert alle Klassen, die in der Reflexions-API enthalten sind.

oder

  • import java.lang.reflect.Method; - es importiert nur die Klasse Method


Beispiel

MethodCaller Klasse

Beispiel für eine einfache MethodCaller Klasse

import java.lang.reflect.Method;

public class MethodCaller 
{
    public void startMethod(String methodName) throws Exception 
	{
        // Holen Sie sich die Klasse, in der die Methode definiert ist
        Class<?> targetClass = this.getClass();

        // Holen Sie sich die Methode basierend auf dem Namen
        Method method = targetClass.getDeclaredMethod(methodName);

        // Rufe die Methode auf
        method.invoke(this);
    }

    public void method1() 
	{
        System.out.println("Methode 1 wurde aufgerufen");
    }

    public void method2() 
	{
        System.out.println("Methode 2 wurde aufgerufen");
    }

}

MyPluginClass Klasse

Beispiel für eine MyPluginClass Klasse

package net.mypackage.mainerstesplugin;

import net.risingworld.api.Plugin;
import net.risingworld.api.events.EventMethod;
import net.risingworld.api.events.Listener;
import net.risingworld.api.objects.Player;
import net.risingworld.api.events.player.PlayerConnectEvent;
import net.risingworld.api.events.player.PlayerSpawnEvent;
import net.risingworld.api.events.player.PlayerCommandEvent;

public class MyPluginClass extends Plugin implements Listener
{
    @Override
    public void onEnable()
    {
       registerEventListener(this);
       System.out.println(this.getName() + ":  ist geladen");
    }

    @Override
    public void onDisable()
    {
        // Plugin wurde entladen
    }
    
    @EventMethod
	public void onPlayerConnectEvent(PlayerConnectEvent event) 
	{
		System.out.println(this.getName() + ":  Player Connect");
	}

    @EventMethod
    public void onPlayerSpawn(PlayerSpawnEvent event)
    {
        Player player = event.getPlayer();
        player.sendTextMessage("Player "+player.getName()+" Spawn");
    }

    @EventMethod
    public void onPlayerCommand(PlayerCommandEvent event) 
    {
        //diese Methode wird aufgerufen, wenn das "PlayerCommandEvent" ausgelöst wird
		
		MethodCaller caller = new MethodCaller();

		//Befehl durch Leerzeichen Teilen
		String[] cmd = event.getCommand().split(" ");

		//Spieler, der den Befehl ausgeführt hat
		Player player = event.getPlayer();

		// Wenn der Spieler "/call" eingibt
		if (cmd[0].equalsIgnoreCase("/call")) 
		{
			if (cmd.length == 2)
			{
				try 
				{
					caller.startMethod(cmd[1]);
				} 
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
	    }
    }
}

Siehe auch