Java newInstance 在不应该的地方抛出错误
Java newInstance throws error where it shouldn't
我目前正在为自己编写一个私有 Java API,它使用 Class
来允许 API 的特定部分(统计数据保存部分)在不改变底层用法的情况下进行扩展。我喜欢这种方法,但出于某种原因,每当 API 尝试执行 theClass.newInstance()
时,它都会抛出如下错误:
java.lang.IllegalAccessError: tried to access method me.duper51.DuperFramework.utils.player.StatsObject.<init>()V from class me.duper51.Skyrings.stats.SkyringsStats
at me.duper51.Skyrings.stats.SkyringsStats.<init>(SkyringsStats.java:14) ~[?:?]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_131]
at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_131]
at me.duper51.DuperFramework.utils.player.PlaygroundPlayer.getStats(PlaygroundPlayer.java:71) ~[?:?]
at me.duper51.Skyrings.listeners.GameListener.lambda$getReplacements[=11=](GameListener.java:65) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarOption.update(SidebarOption.java:44) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarOption.update(SidebarOption.java:53) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarManager.updateAll(SidebarManager.java:75) ~[?:?]
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-21fe707-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:723) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
其中 me.duper51.Skyrings.stats.SkyringsStats
是扩展 class,me.duper51.DuperFramework.utils.player.StatsObject
是基础 class。
扩展对象如下所示:
public class SkyringsStats extends StatsObject {
public SkyringsStats() {
super();
}
private int kills = 0;
private int wins = 0;
private int totalPlays = 0;
private int deaths = 0;
public void incrementKills() {
kills++;
}
public void incrementDeaths() {
deaths++;
}
public void incrementTotalPlays() {
totalPlays++;
}
public void incrementWins() {
wins++;
}
public int getKills() {
return kills;
}
public int getWins() {
return kills;
}
public int getDeaths() {
return kills;
}
public int getGamesPlayed() {
return kills;
}
}
根据另一个答案的要求,这是 javap -p me.duper51.DuperFramework.utils.player.StatsObject
的输出
Compiled from "StatsObject.java"
public class me.duper51.DuperFramework.utils.player.StatsObject {
private java.util.UUID pUUID;
public me.duper51.DuperFramework.utils.player.StatsObject();
void setpUUID(java.util.UUID);
public void commitChanges(me.duper51.DuperFramework.GamePlugin);
private static void lambda$commitChanges[=13=]();
}
StatsObject
的默认构造函数是私有的或以其他方式不可访问,并且自此代码编译后就必须如此。
就我而言,我使用 Jenkins 作为构建此应用程序的方法。然后将 JAR 加载到另一个应用程序中。 DuperAPI包有多个版本,第一个加载的JAR有优势。这导致了差异并最终导致了错误。我调整了着色系统以不包含上游不需要的文件 API.
我目前正在为自己编写一个私有 Java API,它使用 Class
来允许 API 的特定部分(统计数据保存部分)在不改变底层用法的情况下进行扩展。我喜欢这种方法,但出于某种原因,每当 API 尝试执行 theClass.newInstance()
时,它都会抛出如下错误:
java.lang.IllegalAccessError: tried to access method me.duper51.DuperFramework.utils.player.StatsObject.<init>()V from class me.duper51.Skyrings.stats.SkyringsStats
at me.duper51.Skyrings.stats.SkyringsStats.<init>(SkyringsStats.java:14) ~[?:?]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_131]
at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_131]
at me.duper51.DuperFramework.utils.player.PlaygroundPlayer.getStats(PlaygroundPlayer.java:71) ~[?:?]
at me.duper51.Skyrings.listeners.GameListener.lambda$getReplacements[=11=](GameListener.java:65) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarOption.update(SidebarOption.java:44) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarOption.update(SidebarOption.java:53) ~[?:?]
at me.duper51.DuperFramework.utils.scoreboard.SidebarManager.updateAll(SidebarManager.java:75) ~[?:?]
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-21fe707-e1ebe52]
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:723) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
其中 me.duper51.Skyrings.stats.SkyringsStats
是扩展 class,me.duper51.DuperFramework.utils.player.StatsObject
是基础 class。
扩展对象如下所示:
public class SkyringsStats extends StatsObject {
public SkyringsStats() {
super();
}
private int kills = 0;
private int wins = 0;
private int totalPlays = 0;
private int deaths = 0;
public void incrementKills() {
kills++;
}
public void incrementDeaths() {
deaths++;
}
public void incrementTotalPlays() {
totalPlays++;
}
public void incrementWins() {
wins++;
}
public int getKills() {
return kills;
}
public int getWins() {
return kills;
}
public int getDeaths() {
return kills;
}
public int getGamesPlayed() {
return kills;
}
}
根据另一个答案的要求,这是 javap -p me.duper51.DuperFramework.utils.player.StatsObject
Compiled from "StatsObject.java"
public class me.duper51.DuperFramework.utils.player.StatsObject {
private java.util.UUID pUUID;
public me.duper51.DuperFramework.utils.player.StatsObject();
void setpUUID(java.util.UUID);
public void commitChanges(me.duper51.DuperFramework.GamePlugin);
private static void lambda$commitChanges[=13=]();
}
StatsObject
的默认构造函数是私有的或以其他方式不可访问,并且自此代码编译后就必须如此。
就我而言,我使用 Jenkins 作为构建此应用程序的方法。然后将 JAR 加载到另一个应用程序中。 DuperAPI包有多个版本,第一个加载的JAR有优势。这导致了差异并最终导致了错误。我调整了着色系统以不包含上游不需要的文件 API.