经过几个小时的工作,我得到了jaxb与android合作。 我创建了许多自己的带有自己前缀的jar文件(而不是javax.xml.bind。*我称之为rebuild.javax.xml.bind。*)。 它适用于我的项目中的类,但我必须使其适用于其他导入(Java BuildPath - > Projects)项目中的类,但导入项目的每个类都引用javax.xml。如果我运行它会崩溃我的应用程序(因为在android中没有javax.xml.bind)。
我没有对其他项目的写访问权限,我怎样才能使它工作? 如果我复制第二个项目中的每个类并将导入von javax复制到rebuild.javax,它工作正常,但每次更改时我都无法重新导入它。
因为我的英语不好,我希望你们能理解我:)
答案 0 :(得分:0)
也许您可以使用自定义ClassLoader
在加载其类之前用javax.xml.bind.*
替换rebuild.javax.xml.bind.*
的出现次数。
这样的事情:
public class JaxbClassLoader extends ClassLoader {
[...]
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if(name.startsWith("javax.xml.bind"))
name = "rebuild." + name;
super.loadClass(name);
}
}
也许Class.findClass
也应该被覆盖,但我不确定。
然后,您创建一个自定义Application
类并将其替换为ClassLoader
,如下所示:
private ClassLoader loader;
@Override
public void onCreate() {
Thread.currentThread().setContextClassLoader(getClassLoader());
}
@Override
public ClassLoader getClassLoader() {
if(loader == null)
loader = new JaxbClassLoader(super.getClassLoader());
return loader;
}
不要忘记在Application
中声明AndroidManifest
。
设置上下文类加载器是额外的,但可能有用。
覆盖getClassLoader()
将导致返回的加载器在此应用程序上下文中创建的Activities
中使用。
在某些特定条件下,您可能需要再次显式设置CCL,例如,在创建新Thread
时。在这种情况下,ThreadLocal
可能会有所帮助。