![](/img/trans.png)
[英]Unable to make field final transient java.lang.Class java.util.EnumSet.elementType accessible: module java.base does not "opens java.util" to unnamed
[英]Can't get JSON String by using gson.toJson(Element), {module java.base does not "opens java.util" to module com.google.gson]
我正在开发一个 minecraft-forge mod,它从游戏中收集数据并将整个数据转换为 JSON 字符串。 当我的班级只有以下字段时,该模块运行良好:
public class MyInfo {
public int ID;
public float Health;
public double X;
public double Y;
public double Z;
public MyInfo(Player play) {
ID = play.getId();
Health = play.getHealth();
X = play.getX();
Y = play.getY();
Z = play.getZ();
}
Player
是net.minecraft.world.entity.player.Player
的一个实例,我可以在其中检索一些我想要的数据。
它工作正常,我制作 JSON 字符串的行没有遇到任何问题。
Gson _Json = new GsonBuilder().setPrettyPrinting().create();
MyInfo pers = new MyInfo(player);
String Data = _Json.toJson(pers);
问题:
在我的MyInfo
类中添加一个ArrayList
字段后,我现在将展示:
public class MyInfo {
public int ID;
public float Health;
public double X;
public double Y;
public double Z;
public ArrayList<MobEffectInstance> ActivePotionEffects;
public MyInfo(Player play) {
ID = play.getId();
Health = play.getHealth();
X = play.getX();
Y = play.getY();
Z = play.getZ();
ActivePotionEffects = new ArrayList<>(play.getActiveEffects()); //the method .getActiveEffects returns a Collection<MobEffectIstance>
}
线程一到达我使用_Json.toJson(pers)
的行就会遇到异常,异常说:
Exception in thread "Thread-6" java.lang.reflect.InaccessibleObjectException:
Unable to make field private final java.util.concurrent.atomic.AtomicLong java.util.Random.seed accessible: module java.base does not "opens java.util" to module com.google.gson
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.getAdapter(Gson.java:489)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.toJson(Gson.java:727)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.toJsonTree(Gson.java:628)
at MC-BOOTSTRAP/com.google.gson@2.8.9/com.google.gson.Gson.toJsonTree(Gson.java:607)
如果我在实例化_Json
的同一个类中实例化一个ArrayList<Integer>
并通过 FOR 循环填充它,然后使用toJson()
,则不会出现有关访问java.lang
的Gson
的问题
IE:
ArrayList<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
numbers.add(i);
}
Gson _Json = new GsonBuilder().setPrettyPrinting().create();
MyInfo playr = new MyInfo(player);
String Data = _Json.toJson(numbers); //<-- not passing *playr* anymore, but *numbers*
编辑:
我找到了一个解决方法,它主要是为了我的目的,并且是将类型MobEffectInstance
分解为原始数据类型(即String
或Integer
)并将这些值放在一个集合中
public class MyInfo {
public int ID;
public float Health;
public double X;
public double Y;
public double Z;
public HashMap<String,Integer> ActivePotionEffects;
public MyInfo(Player play) {
ID = play.getId();
Health = play.getHealth();
X = play.getX();
Y = play.getY();
Z = play.getZ();
ActivePotionEffects = new HashMap<>();
ArrayList<MobEffectInstance> Temp = new ArrayList<>(play.getActiveEffects());
for (MobEffectInstance mobEffectInstance : Temp) {
ActivePotionEffects.put(mobEffectInstance.getDescriptionId(), mobEffectInstance.getDuration());
}
}
在初始化数组列表的地方,你有空的 <> 括号,它们应该有 MobEffectInstance 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.