请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

proguard在优化的时候回去掉无用的类会不会造成反射找不到类

通过反射可以去实例化一个类,而这个类在反射的时候才会动态加载.

如果在EditText中输入一个字符串(com.android.entity.Person)作为我们要实例化的类.而这个Person类和字符串在代码的任何地方都没有使用到.proguard的EntryPoint优化时,就会把这个Person类去掉.那么我们在运行的时候再EditText中输入这个字符串,通过反射去加载,会不会出现找不到这个类?或者说是proguard有其他的解决办法

正在回答 回答被采纳积分+3

1回答

DocMike 2017-11-08 11:51:29

你的想法很好 我有一个问题 现实如何操作?你给我个具体的步骤吧

0 回复 有任何疑惑可以回复我~
  • 提问者 慕村3248242 #1
    比如:
    我在代码中写了一个Shape的抽象类,我在里面定义了一个draw的方法.这个Shape类有很多子类:Triangle  Circle Rectangle ..... ,并且随着项目的迭代开发这个子类还在不停的扩展,形状会越来越多.
    接着在代码的其他地方只使用了Shape的父类,调用方法也是通过shape.draw()完成.
    接下来就是子类的实例化了.实例的时候通过Android的EditText编辑框获取用户输入的一个字符串,比如用户手动输入packagename.Circle;等输入完成就通过反射去实例化Circle这个类.最后通过Shape持有子类的实例,调用draw方法
    Class c=Class.forName( editText.getText().toString() );
    Shape s=(Shape)c.newInstance();
    s.draw();
    在这段代码中没有出现Shape子类(Triangle  Circle Rectangle ..... )有关的字符串,proguard 的EntryPoint也不能标记上这几个子类被用到了.
    因此在优化之前程序能这场运行,优化之后就会出问题
    回复 有任何疑惑可以回复我~ 2017-11-08 14:58:58
  • DocMike 回复 提问者 慕村3248242 #2
    你这个确实是一个问题,这个问题我还确实遇到过,当时没办法好想重新把keep注释掉来着,让我回忆下 给你整理出来。。
    回复 有任何疑惑可以回复我~ 2017-11-08 15:14:42
  • 提问者 慕村3248242 回复 DocMike #3
    恩好  非常感谢
    回复 有任何疑惑可以回复我~ 2017-11-08 16:44:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信