KeyValueX icon indicating copy to clipboard operation
KeyValueX copied to clipboard

使用时报错:ClassNotFoundException & ClassCastException

Open KXwonderful opened this issue 2 years ago • 7 comments

我尝试着集成在项目中测试,在启动 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

KXwonderful avatar Aug 26 '22 09:08 KXwonderful

可以进入 KeyValueProvider.get 调试看看具体哪行报错了

KunMinX avatar Aug 26 '22 09:08 KunMinX

我这里也出现了这个问题,再第20行

Class<T> clazz1 = (Class<T>) Class.forName(clazzName + "Impl");

Jarvis-Lau avatar Sep 01 '22 11:09 Jarvis-Lau

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 avatar Sep 23 '22 09:09 MyRui

@MyRui 感谢反馈。混淆使原来的类消失不见,由于生成类和接口处于同一目录,所以反射时需 keep 相应目录, 如不想 keep,则不可使用反射。在第一次创建接口时,build 一次,获取生成类来使用即可,例如:

Configs configs = new ConfigsImpl();

KunMinX avatar Sep 24 '22 03:09 KunMinX

@KXwonderful @Jarvis-Lau @MyRui @syxc

我在别的项目测试发现,转换失败是因为 impl 类其实没有生成。 可以试试 keyvalue 的依赖放在定义 keyvalue 接口的 module,例如 app module。

KunMinX avatar Oct 18 '22 13:10 KunMinX

我集成测试的时候出现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. 和这个包有冲突吗?

MrZhangX avatar Mar 01 '23 06:03 MrZhangX

统一回复:

建议将 gradle 依赖配置在定义 @KeyValueX 接口所在的模块,以免发生 ClassNotFoundException & ClassCastException 情况

KunMinX avatar Mar 01 '23 08:03 KunMinX