具有隐藏构造函数的抽象实例 class

Instance of abstract class with hidden constructor

我需要创建一个带有隐藏构造函数的抽象 class 的实例,class 如下所示:

public abstract class TestClass {
    /**
    * @hide
    */
    public TestClass() {
    }
}

创建具体的 class 不起作用,因为构造函数不可见,并且通过反射调用构造函数 API 也不起作用,因为 class 是抽象的。

我需要创建一个 android.print.PrintDocumentAdapter.LayoutResultCallback

的实例

本教程似乎解决了如何执行您的要求:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/。我自己从来没有这样做过,所以我不能保证。

注意: API 中的方法被隐藏是有原因的。对于开发人员来说最重要的是,不能保证该方法会持续存在任何时间长度,因为所讨论的方法不属于任何 public API.

我 运行 遇到了完全相同的问题(即使是完全相同的 class),我有一个比按照建议将 android.jar 替换为 framework.jar 更好的解决方案在另一个答案中。

解决方案使用dexmaker library。 (您将需要 dexmaker.1.4.jar 和 dexmaker-dx.1.4.jar)。这是一个在运行时为 Dalvik VM(android 中使用的 VM)生成字节码的库。

这个库有一个名为 ProxyBuilder 的 class,它为摘要 class 生成一个 代理。代理是一个对象,它 扩展抽象 class 并通过将方法分派给您指定的 java.lang.reflect.InvocationHandler 实例来实现方法。

ProxyBuilderjava.lang.refect.Proxy几乎一样,只是java.lang.refect.Proxy只对接口起作用,而dexmaker的ProxyBuilder对抽象classes起作用,是我们解决问题所需要的。

代码全部为:

public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler,
                                                                                File dexCacheDir) throws  IOException{
    return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class)
            .dexCache(dexCacheDir)
            .handler(invocationHandler)
            .build();
}

回调逻辑在您提供的 invocationHandler 中实现。 cacheDir 是 dexmaker 可以存放一些文件的目录。