在Java中为导入的项目使用自己的导入

时间:2014-03-05 16:03:59

标签: android import jaxb

经过几个小时的工作,我得到了jaxb与android合作。 我创建了许多自己的带有自己前缀的jar文件(而不是javax.xml.bind。*我称之为rebuild.javax.xml.bind。*)。 它适用于我的项目中的类,但我必须使其适用于其他导入(Java BuildPath - > Projects)项目中的类,但导入项目的每个类都引用javax.xml。如果我运行它会崩溃我的应用程序(因为在android中没有javax.xml.bind)。

我没有对其他项目的写访问权限,我怎样才能使它工作? 如果我复制第二个项目中的每个类并将导入von javax复制到rebuild.javax,它工作正常,但每次更改时我都无法重新导入它。

因为我的英语不好,我希望你们能理解我:)

1 个答案:

答案 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可能会有所帮助。