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

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

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

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

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

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

该解决方案使用dexmaker库 。 (您将需要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可以存储某些文件的目录。

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

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