我需要使用隐藏的构造函数创建一个抽象类的实例,该类如下所示:
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建具体类不起作用,因为构造函数不可见,并且通过反射API调用构造函数也不起作用,因为该类是抽象的。
我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback实例
答案 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可以存储某些文件的目录。