java.lang.SecurityException:无法使 java.lang.reflect.Method 构造函数可访问

问题描述 投票:0回答:3

我使用的是Gson 2.8.2版本

我使用了下面的代码

public void saveObject(View view){
        SharedPreferences prefs = this.getSharedPreferences(
                "com.example.app", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String str = gson.toJson(view, View.class);
        editor.putString("text", str);
        editor.commit();
}

但我收到如下错误

Process: com.example.amitsiddhpura.paperview, PID: 17252
                                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.amitsiddhpura.paperview/com.example.amitsiddhpura.paperview.MainActivity}: **java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible**
                                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
                                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
                                                                                         at android.app.ActivityThread.-wrap11(Unknown Source:0)
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                         at android.os.Looper.loop(Looper.java:164)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                                         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                                                                                      Caused by: java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible
                                                                                         at java.lang.reflect.AccessibleObject.setAccessible0(AccessibleObject.java:131)
                                                                                         at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:115)
                                                                                         at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:101)
                                                                                         at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:83)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:99)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
                                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
                                                                                         at com.google.gson.Gson.getAdapter(Gson.java:423)
                                                                                         at com.google.gson.Gson.toJson(Gson.java:661)
                                                                                         at com.google.gson.Gson.toJson(Gson.java:648)
                                                                                         at com.google.gson.Gson.toJson(Gson.java:603)
                                                                                         at com.example.amitsiddhpura.paperview.MainActivity.saveObject(MainActivity.java:34)
                                                                                         at com.example.amitsiddhpura.paperview.MainActivity.onCreate(MainActivity.java:23)
                                                                                         at android.app.Activity.performCreate(Activity.java:6999)
                                                                                         at android.app.Activity.performCreate(Activity.java:6990)
                                                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
                                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
                                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
                                                                                         at android.app.ActivityThread.-wrap11(Unknown Source:0) 
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                         at android.os.Looper.loop(Looper.java:164) 
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6494) 
                                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                                         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
java android gson
3个回答
6
投票

您正在尝试保存包含上下文的 View 类,该类无法序列化。 请阅读此处。


0
投票

toJson 方法中的第一个参数视图是错误的。来自文档Class GSON。传递合适的参数就可以了

toJson(JsonElement jsonElement)

将 JsonElements 树转换为其等效的 JSON 代表。

void toJson(JsonElement jsonElement,可附加写入器)

写出 JsonElements 树的等效 JSON。

void toJson(JsonElement jsonElement, JsonWriter writer)

将 jsonElement 的 JSON 写入 writer。

字符串 toJson(对象 src)

该方法将指定对象序列化为其等价的Json 代表。

void toJson(对象 src,可附加写入器)

该方法将指定对象序列化为其等价的Json 代表。

String toJson(对象 src,类型 typeOfSrc)

该方法序列化指定的对象,包括 泛型类型,转换成其等效的 Json 表示形式。

void toJson(对象 src,类型 typeOfSrc,可追加写入器)

该方法序列化指定的对象,包括 泛型类型,转换成其等效的 Json 表示形式。

void toJson(对象 src,类型 typeOfSrc,JsonWriter writer)

将 typeOfSrc 类型的 src 的 JSON 表示形式写入 writer。


0
投票

您可以创建该类的伴生对象并使用它

© www.soinside.com 2019 - 2024. All rights reserved.