private void set(String name) { LogUtil.d("attach " + name); Object obj = RefInvoker.getFieldObject(this, Activity.class.getName(), name); if (obj != null) { RefInvoker.setFieldObject(activity, Activity.class.getName(), name, obj); } }
/** * for eclipse & ant with public.xml * * <p>unused * * @param pluginDescriptor * @param res * @return */ private static boolean checkPluginPublicXml(PluginDescriptor pluginDescriptor, Resources res) { // "plugin_layout_1"资源id时由public.xml配置的 // 如果没有检测到这个资源,说明编译时没有引入public.xml, // 这里直接抛个异常出去。 // 不同的系统版本获取id的方式不同, // 三星4.x等系统适用 int publicStub = res.getIdentifier("plugin_layout_1", "layout", pluginDescriptor.getPackageName()); if (publicStub == 0) { // 小米5.x等系统适用 publicStub = res.getIdentifier("plugin_layout_1", "layout", sApplication.getPackageName()); } if (publicStub == 0) { try { // 如果以上两种方式都检测失败,最后尝试通过反射检测 Class layoutClass = ((ClassLoader) pluginDescriptor.getPluginClassLoader()) .loadClass(pluginDescriptor.getPackageName() + ".R$layout"); Integer layouId = (Integer) RefInvoker.getFieldObject(null, layoutClass, "plugin_layout_1"); if (layouId != null) { publicStub = layouId; } } catch (ClassNotFoundException e) { e.printStackTrace(); } } if (publicStub == 0) { throw new IllegalStateException( "\n插件工程没有使用public.xml给资源id分组!!!\n" + "插件工程没有使用public.xml给资源id分组!!!\n" + "插件工程没有使用public.xml给资源id分组!!!\n" + "重要的事情讲三遍!!!"); } return true; }