隐藏构造函数的抽象类实例
我需要使用隐藏的构造函数创建一个抽象类的实例,该类如下所示:
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的一部分。