KeyValueX
KeyValueX copied to clipboard
使用时报错:ClassNotFoundException & ClassCastException
我尝试着集成在项目中测试,在启动 Activity
发现会报 java.lang.ClassNotFoundException: com.xxx.xxx.xxx.ConfigsImpl
的错误,集成使用方式如下:
implementation 'com.github.KunMinX.KeyValueX:keyvalue:3.2.0-beta'
annotationProcessor 'com.github.KunMinX.KeyValueX:keyvalue-compiler:3.2.0-beta'
@KeyValueX
public interface Configs {
KeyValueBoolean isLogin();
}
public class WelcomeActivity extends AppCompatActivity {
Configs configs = KeyValueProvider.get(Configs.class); // 这行会报错
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
LogUtils.wLog().e("isLogin=" + configs.isLogin().get());
configs.isLogin().set(!configs.isLogin().get());
}
}
并且 crash:
Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to xxx.xxx.xxx.Configs
可以进入 KeyValueProvider.get 调试看看具体哪行报错了
我这里也出现了这个问题,再第20行
Class<T> clazz1 = (Class<T>) Class.forName(clazzName + "Impl");
Configs configs = KeyValueProvider.get(Configs.class); 混淆后,Configs类找不到了,最后返回了一个空Object,类型转换出错ClassCastException
public class KeyValueProvider {
@NonNull public static <T> T get(Class<?> clazz) { try { String clazzName = clazz.getName(); if (keyValueGroup.get(clazzName) != null) { return (T) keyValueGroup.get(clazzName); } Class<T> clazz1 = (Class<T>) Class.forName(clazzName + "Impl"); T t = clazz1.newInstance(); keyValueGroup.put(clazzName, t); return t; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return (T) new Object(); } }
@MyRui 感谢反馈。混淆使原来的类消失不见,由于生成类和接口处于同一目录,所以反射时需 keep 相应目录, 如不想 keep,则不可使用反射。在第一次创建接口时,build 一次,获取生成类来使用即可,例如:
Configs configs = new ConfigsImpl();
@KXwonderful @Jarvis-Lau @MyRui @syxc
我在别的项目测试发现,转换失败是因为 impl 类其实没有生成。 可以试试 keyvalue 的依赖放在定义 keyvalue 接口的 module,例如 app module。
我集成测试的时候出现C:\Users\Administrator.gradle\caches\transforms-2\files-2.1\473b1087ead3bac3dd5e8fb548ea0491\core-1.8.0\res\values\values.xml:104:5-113:25: AAPT: error: resource android:attr/lStar not found. 和这个包有冲突吗?
统一回复:
建议将 gradle 依赖配置在定义 @KeyValueX 接口所在的模块,以免发生 ClassNotFoundException & ClassCastException 情况