起因
leader 提的诡异需求,有一批旧项目,需要在一个 android 项目中使用。 使用场景是在 android 设备中通过网络下载这些 jar (已使用 dx --dex 转换 bytecode ),加载并启动。 但是由于环境的变化导致原项目中一些资源请求不存在,需要重定向。
经过
目前的做法是,在 android 项目中使用自定义 ClassLoader 加载这些 jar,并启动。
目前碰到的问题是由于旧项目中大量的使用了
Class.class.getResourceAsSteam和this.getClass().getResourceAsStream方法。
后者由于是通过我自定义的 ClassLoader 加载, 因此调用请求会被委托到我自定义 ClassLoader 的 getResourceAsStream 方法上。没有问题。
问题就在于Class.class.getResourceAsSteam这样的调用,由于双亲委派,是由 Boot ClassLoader 加载。
因此我无法重定向这些资源请求。
尝试过这些方案:
- 自定义 ClassLoader,不执行双亲委派原则。但是此时我的自定义 ClassLoader 无法加载系统类的.jar 文件。提示 refusing reopen framework .....(filename)
- 在自定义 ClassLoader 中,尝试通过双亲委派获得的 Class 对象,通过反射修改其 classloader 对象。[失败]原因不明,提示找不到 classloader 对应的字段。通过
Field.getDeclaredFields()方法,也确实没有该属性
求结果
目前需要的效果是,可以通过各种奇技淫巧(不包括修改旧项目的源代码),重定向这些代码中的类似
String/Class/System.clsss.getResourceAsStream方法的调用。
感谢各位能够提供解决方法或者思路的。