隐藏构造函数的抽象类实例

时间:2015-03-30 18:19:29

标签: java android reflection abstract-class

我需要使用隐藏的构造函数创建一个抽象类的实例,该类如下所示:

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

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

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

2 个答案:

答案 0 :(得分:2)

本教程似乎解决了如何做你要问的问题:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/。我自己从未这样做过,所以我无法保证。

警告:有一个原因是隐藏了API中的方法。对开发人员来说最重要的是,无法保证该方法会在任何时间内保持不变,因为所讨论的方法不属于任何公共API。

答案 1 :(得分:2)

我遇到了完全相同的问题(甚至是同一个类),我有一个更好的解决方案,而不是像其他答案所建议的那样用framework.jar替换android.jar。

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

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

ProxyBuilder几乎与java.lang.refect.Proxy完全相同,只是java.lang.refect.Proxy仅适用于接口,而dexmaker的ProxyBuilder适用于抽象类,这是我们需要解决的问题

代码全是:

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可以存储某些文件的目录。