Java .class aus Hashmap laden

Jon

Mitglied
Hallo Javafreunde,

Ich möchte für ein Project in ein Hashlist aufgelistete .class zu ein bestimmten Zeitpunkt laden.
Ich habe es schon mit Class und den Constructor versucht an die run-Methode ranzukommen, aber vergeblich.

Hier mein Code:

PHP:
package de.bukkit.java.jonas18175.MiniGames;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GameReflector {

	private Class<?> Game = null;
	private Object GameObject = null;

	public Class<?> setGame(String gameName) 
	{
		GameArenas.linkGames();
		
		GameArenas gamearena = GameArenas.toEnum(gameName);
		Game = GameArenas.GameClasses.get(gamearena).getClass();
		Constructor<?> GameConstructor;
		try {
			GameConstructor = Game.getConstructor();
			GameObject = GameConstructor.newInstance();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return Game;
	}
	
	public Method isStarted()
	{
		try {
			return Game.getMethod("isStarted", GameObject.getClass());
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public Method setStarted(boolean Started)
	{
		try 
		{
			Method setStarted = Game.getMethod("setStarted", Game);
		    try 
		    {
		    	@SuppressWarnings("rawtypes")
				Constructor GameConstructor = Game.getConstructor(new Class[0]);
				try {
					Object GameObject = GameConstructor.newInstance(new Object[0]);
					setStarted.invoke(GameObject, new Object[] { new Boolean(Started)});
				} catch (InstantiationException e) {
					e.printStackTrace();
				}
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace(); 
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	public Method run()
	{
		try {
			return Game.getMethod("run", Game);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return null;
	}
}
Die Fehlermeldung:
PHP:
12:49:26 WARN]: java.lang.NoSuchMethodException: java.lang.Class.<init>()
[12:49:26 WARN]: 	at java.lang.Class.getConstructor0(Class.java:2810)
[12:49:26 WARN]: 	at java.lang.Class.getConstructor(Class.java:1718)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.GameReflector.setGame(GameReflector.java:20)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.Arena.setGame(Arena.java:138)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.CommandMain.onCommand(CommandMain.java:184)
[12:49:26 WARN]: 	at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[12:49:26 WARN]: 	at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:196)
[12:49:26 WARN]: 	at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchCommand(CraftServer.java:542)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PlayerConnection.handleCommand(PlayerConnection.java:932)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:814)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PacketPlayInChat.a(PacketPlayInChat.java:28)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PacketPlayInChat.handle(PacketPlayInChat.java:47)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.ServerConnection.c(SourceFile:134)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:655)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617)
[12:49:26 WARN]: java.lang.NoSuchMethodException: java.lang.Class.run(java.lang.Class)
[12:49:26 WARN]: 	at java.lang.Class.getMethod(Class.java:1665)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.GameReflector.run(GameReflector.java:84)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.Arena.run(Arena.java:143)
[12:49:26 WARN]: 	at de.bukkit.java.jonas18175.MiniGames.CommandMain.onCommand(CommandMain.java:185)
[12:49:26 WARN]: 	at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[12:49:26 WARN]: 	at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:196)
[12:49:26 WARN]: 	at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchCommand(CraftServer.java:542)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PlayerConnection.handleCommand(PlayerConnection.java:932)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:814)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PacketPlayInChat.a(PacketPlayInChat.java:28)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.PacketPlayInChat.handle(PacketPlayInChat.java:47)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.ServerConnection.c(SourceFile:134)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:655)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457)
[12:49:26 WARN]: 	at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617)
 
Ok ich habe es jetzt hinbekommen :)
Es war nur die Falsche Klasse und das andere hatte auch nicht ganz gepasst.

PHP:
package de.bukkit.java.jonas18175.MiniGames;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GameReflector {

	private Class<?> Game;

	public void setGame(String gameName) 
	{
		Game = GameArenas.toEnum(gameName).getGameClass();
	}
	
    public boolean isStarted() 
	{
		try {
			if (Game != null)
			{
				Method method = Game.getMethod("isStarted");
				return (Boolean) method.invoke(Game.getConstructor().newInstance());
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	    return false;
	}
    
    public void setStarted(boolean Started) 
	{
		try {
			if (Game != null)
			{
				Method method = Game.getMethod("setStarted");
			    method.invoke(Game.getConstructor().newInstance(), new Object[] { new Boolean(Started) });
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
    
	public void run(String gameName)
	{
		try {
			if (Game != null)
			{
				Method method = Game.getMethod("run");
				method.invoke(Game.getConstructor().newInstance());
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
}
 
Irgendwie quatsch der Code:

Java:
Method method = Game.getMethod("isStarted");
return (Boolean) method.invoke(Game.getConstructor().newInstance());

Bist du dir wirklich sicher was da passiert?
isStarted() wird bei jedem Aufruf auf einer neuen Instanz ausgeführt (.newInstance()).
Hat die Methode schon mal TRUE geliefert? :)
 

Neue Beiträge

Zurück