我在从一个文件调用非静态函数到另一个文件时遇到问题。这是我的代码:
package me.zoteuh.grillade;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Level;
public final class Grillade extends JavaPlugin {
private static Grillade instance;
@Override
public void onEnable() {
instance = this;
AnvilListener anvilListener = new AnvilListener();
anvilListener.loadHeadTextures();
checkFiles();
getServer().getPluginManager().registerEvents(anvilListener, this);
getLogger().info("Grillade Plugin Operational!");
}
public static Grillade getInstance() {
return instance;
}
private void checkFiles() {
if (!getDataFolder().exists()) {
if (getDataFolder().mkdir()) {
getLogger().info("Grillade folder created.");
} else {
getLogger().severe("Unable to create the Grillade folder.");
}
}
File headsFile = new File(getDataFolder(), "heads.json");
if (!headsFile.exists()) {
try {
String defaultHeadsJson = "[\n]";
Files.write(headsFile.toPath(), defaultHeadsJson.getBytes());
getLogger().info("Created heads.json file.");
} catch (IOException e) {
getLogger().log(Level.SEVERE, "Error creating heads.json file.", e);
}
}
}
}
package me.zoteuh.grillade;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.AnvilInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import java.io.*;
import java.util.*;
import java.lang.reflect.Field;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class AnvilListener implements Listener {
private final Map<String, String> headTextures = new HashMap<>();
@EventHandler
public void onAnvilPrepare(PrepareAnvilEvent event) {
loadHeadTextures();
AnvilInventory anvilInventory = event.getInventory();
ItemStack[] contents = anvilInventory.getContents();
ItemStack firstInput = contents[0];
ItemStack secondInput = contents[1];
String renameText = event.getInventory().getRenameText();
List<Material> classicHeads = new ArrayList<>();
classicHeads.add(Material.CREEPER_HEAD);
classicHeads.add(Material.SKELETON_SKULL);
classicHeads.add(Material.ZOMBIE_HEAD);
if (firstInput != null && secondInput == null && classicHeads.contains(firstInput.getType()) &&
renameText != null && headTextures.containsKey(renameText)) {
String texture = headTextures.get(renameText);
ItemStack customHead = createCustomHead(texture, renameText);
event.setResult(customHead);
}
}
private ItemStack createCustomHead(String texture, String name) {
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
profile.getProperties().put("textures", new Property("textures", texture));
try {
Field profileField = skullMeta.getClass().getDeclaredField("profile");
profileField.setAccessible(true);
profileField.set(skullMeta, profile);
skullMeta.setDisplayName(name);
skull.setItemMeta(skullMeta);
return skull;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void loadHeadTextures() {
File jsonFile = new File(Grillade.getInstance().getDataFolder(), "heads.json");
Bukkit.broadcastMessage("Chargement des textures");
if (!jsonFile.exists()) {
return;
}
try {
FileReader reader = new FileReader(jsonFile);
JsonElement jsonElement = JsonParser.parseReader(reader);
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonArray headsArray = jsonObject.getAsJsonArray("heads");
for (JsonElement headElement : headsArray) {
JsonObject headObject = headElement.getAsJsonObject();
String name = headObject.get("name").getAsString();
String texture = headObject.get("texture").getAsString();
headTextures.put(name, texture);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题源自函数“loadHeadTextures”。我想在我的主文件的“onEnable”函数中调用它。
我尝试按照本网站上的说明创建一个实例,但这不起作用 https://www.w3docs.com/snippets/java/calling-non-static-method-in-static-method-in-java.html
我尝试了这里找到的其他几个技巧,但它们都不起作用。 这个问题不是来自我的函数“loadHeadTextures”。我尝试在自己的文件中调用它并且它起作用了;广播在聊天中正确显示。但是,一旦我尝试从主文件中调用它,它就不起作用。我没有任何错误,但什么也没有发生。
您的问题不是由于在不同文件中调用非静态方法造成的。广播消息不会打印到服务器,因为在
Bukkit.broadcastMessage()
方法中使用 onEnable()
不起作用。这是因为调用该方法时服务器尚未完全启动。
尝试使用 System.out.println()
来显示您的消息(因为它似乎用于调试目的),或者如果您确实想要广播,则使用调度程序将其延迟一些时间。