Class not found when unmarshalling: false, e: java.lang.ClassNotFoundException:

本文记录了一个关于自定义View实现Parcelable接口时出现的ClassNotFoundException异常,并详细分析了问题所在及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

04-23 17:04:18.863: E/Parcel(18872): Class not found when unmarshalling: false, e: java.lang.ClassNotFoundException: false
04-23 17:04:18.867: W/dalvikvm(18872): threadid=1: thread exiting with uncaught exception (group=0x40a3a1f8)
04-23 17:04:18.890: E/AndroidRuntime(18872): FATAL EXCEPTION: main
04-23 17:04:18.890: E/AndroidRuntime(18872): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.b6q9.passmanage/com.shai.manage.activity.MainActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: false
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread.access$600(ActivityThread.java:132)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Handler.dispatchMessage(Handler.java:99)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Looper.loop(Looper.java:137)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread.main(ActivityThread.java:4575)
04-23 17:04:18.890: E/AndroidRuntime(18872): at java.lang.reflect.Method.invokeNative(Native Method)
04-23 17:04:18.890: E/AndroidRuntime(18872): at java.lang.reflect.Method.invoke(Method.java:511)
04-23 17:04:18.890: E/AndroidRuntime(18872): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
04-23 17:04:18.890: E/AndroidRuntime(18872): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
04-23 17:04:18.890: E/AndroidRuntime(18872): at dalvik.system.NativeStart.main(Native Method)
04-23 17:04:18.890: E/AndroidRuntime(18872): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: false
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readParcelable(Parcel.java:1966)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.view.AbsSavedState.<init>(AbsSavedState.java:57)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.view.View$BaseSavedState.<init>(View.java:14338)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.view.ext.SatelliteMenu$SavedState.<init>(SatelliteMenu.java:547)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.view.ext.SatelliteMenu$SavedState$1.createFromParcel(SatelliteMenu.java:573)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.view.ext.SatelliteMenu$SavedState$1.createFromParcel(SatelliteMenu.java:1)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readParcelable(Parcel.java:1992)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readValue(Parcel.java:1854)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readSparseArrayInternal(Parcel.java:2123)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readSparseArray(Parcel.java:1576)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readValue(Parcel.java:1911)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Parcel.readMapInternal(Parcel.java:2094)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Bundle.unparcel(Bundle.java:223)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.os.Bundle.getSparseParcelableArray(Bundle.java:1225)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:766)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1014)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1764)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.Activity.onCreate(Activity.java:864)
04-23 17:04:18.890: E/AndroidRuntime(18872): at com.slidingmenu.lib.app.SlidingActivity.onCreate(SlidingActivity.java:20)
04-23 17:04:18.890: E/AndroidRuntime(18872): at com.shai.manage.activity.MainActivity.onCreate(MainActivity.java:48)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.Activity.performCreate(Activity.java:4465)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-23 17:04:18.890: E/AndroidRuntime(18872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)
04-23 17:04:18.890: E/AndroidRuntime(18872): ... 11 more


这个错误发生在ANDROID SDK Tool 更新到22.6.2时,突然发生的,不知道是不是与这个相关

主要问题是出现在保存 VIEW 状态时出错 自定义VIEW类里实现了Parcelable 接口

extends BaseSavedState

static class SavedState extends BaseSavedState {
boolean rotated;
private float totalSpacingDegree;
private int satelliteDistance;
private int measureDiff;
private int expandDuration;
private boolean closeItemsOnClick;

SavedState(Parcelable superState) {
super(superState);
System.out.println("1 "+superState);
}

public SavedState(Parcel in) {
super(in);
rotated = Boolean.valueOf(in.readString());
totalSpacingDegree = in.readFloat();
satelliteDistance = in.readInt();
measureDiff = in.readInt();
expandDuration = in.readInt();
closeItemsOnClick = Boolean.valueOf(in.readString());
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeString(Boolean.toString(rotated));
out.writeFloat(totalSpacingDegree);
out.writeInt(satelliteDistance);
out.writeInt(measureDiff);
out.writeInt(expandDuration);
out.writeString(Boolean.toString(closeItemsOnClick));
}

public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}

public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}

问题出现在没有加入这行代码 super.writeToParcel(out, flags);
`java.lang.ClassNotFoundException` 是 Java 中常见的异常之一,表示运行时无法找到指定的类。当抛出 `java.lang.reflect.InaccessibleObjectException` 时,通常是因为尝试访问或修改一个不可访问的类成员(如私有字段或方法),并且未通过 `setAccessible(true)` 来绕过 Java 的访问控制检查。 如果出现 `ClassNotFoundException` 指向 `java.lang.reflect.InaccessibleObjectException`,则可能是以下原因导致: ### 原因分析 1. **JVM 版本不兼容** 在某些旧版本的 JVM 中,`InaccessibleObjectException` 可能不存在,或者其所在的模块未被正确加载。例如,Java 9 引入了模块系统(JPMS),部分反射相关的类可能需要显式声明依赖[^1]。 2. **类路径问题** 如果应用程序试图通过自定义类加载器加载类,但类路径配置错误,可能导致核心类如 `InaccessibleObjectException` 无法找到。这在使用隔离类加载环境(如 OSGi 或某些容器)时尤为常见[^1]。 3. **安全策略限制** 在启用安全管理器的情况下,某些类加载操作可能被阻止,导致 `InaccessibleObjectException` 被抛出,而该类本身又未能正确加载,从而引发 `ClassNotFoundException`。 4. **混淆工具或 AOT 编译问题** 使用 ProGuard、GraalVM Native Image 等工具时,若未正确保留反射所需的类和方法,可能导致运行时找不到 `InaccessibleObjectException` 类[^1]。 ### 解决方案 1. **确保 JVM 兼容性** 确保运行环境的 Java 版本与编译环境一致,并且支持所需类。对于 Java 9 及以上版本,确认是否启用了适当的模块(如 `--add-modules java.base`)。 2. **检查类加载机制** 避免使用非标准类加载器加载核心类。如果必须使用自定义类加载器,应确保其委托给父类加载器以保证核心类的可用性。 3. **更新安全管理策略** 如果启用了安全管理器,添加适当的权限允许类加载和反射操作: ```java grant { permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; }; ``` 4. **调整构建工具配置** 如果使用了代码混淆或提前编译工具,确保保留必要的反射类和方法。例如,在 GraalVM Native Image 配置中添加: ```json { "name": "java.lang.reflect.InaccessibleObjectException", "allDeclaredConstructors": true, "allPublicMethods": true } ``` 5. **避免不必要的反射操作** 如果应用逻辑中频繁使用反射来访问私有成员,考虑重构代码以使用公共 API 或设计模式,减少对 `setAccessible(true)` 的依赖。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值