Java 具有隐藏构造函数的抽象类的实例
我需要创建一个带有隐藏构造函数的抽象类的实例,该类如下所示:Java 具有隐藏构造函数的抽象类的实例,java,android,reflection,abstract-class,Java,Android,Reflection,Abstract Class,我需要创建一个带有隐藏构造函数的抽象类的实例,该类如下所示: public abstract class TestClass { /** * @hide */ public TestClass() { } } 创建一个具体的类不起作用,因为构造函数不可见,而通过反射API调用构造函数也不起作用,因为类是抽象的 我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback的实例。本教程似乎介绍
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建一个具体的类不起作用,因为构造函数不可见,而通过反射API调用构造函数也不起作用,因为类是抽象的
我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback的实例。本教程似乎介绍了如何执行您的要求:。我自己从来没有做过这件事,所以我不能担保
请注意:API中的方法被隐藏是有原因的。对于开发人员来说,最重要的是,无法保证该方法会保留任何时间,因为所讨论的方法不是任何公共API的一部分。我遇到了完全相同的问题(甚至对于完全相同的类)我有一个比用framework.jar替换android.jar更好的解决方案 该解决方案使用。(您将需要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可以存储一些文件的目录。抽象类的实例???“我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback的实例”:为什么?您所要做的就是创建一个扩展PrintDocumentAdapter
的类,并确保覆盖onLayout(…)
以使用LayoutResultCallback
。我知道不可能创建这个类的直接实例,因为它是抽象的,但是继承类也是不可能的,因为构造函数是隐藏的,这就是问题所在。我想使用WebView中现有的PrintDocumentAdapter
。createPrintDocumentAdapter(String documentName)
要将网页转换为PDF,我知道我可以使用PrintManager保存PDF,但这必须在没有用户交互的情况下工作,所以我想自己调用PrintDocumentAdapter的onStart、onLayout和onWrite。@Andreas使用此方法可以从WebView成功创建PDF吗?我正在尝试做同样的事情…我认为在这种情况下使用类是安全的,因为类本身和方法没有隐藏,或者在内部API中,只有构造函数是隐藏的。在这种情况下,您可能是正确的。但是,构造函数的签名(参数类型等)仍然可以在没有警告的情况下更改(在不同版本的Android上甚至可能有所不同)。我不是想阻止你做你想做的事情,只是想确保你了解在其他版本的Android上可能遇到的运行时错误的来源。感谢这个解决方案,我会在几天内尝试:)这对Android 5.x有效吗?因为Dalvik在Android 5.0中被ART取代了是的。我在安卓6上测试了它。这门艺术似乎使用了与Dalvik相同的字节码。因为dexmaker生成Dex字节码,所以dexmaker也适用于艺术。我在哪里可以找到这个dexmaker-dx-1.4.jar?在项目的github站点上,只有dexmaker-1.4.jar的下载。第二个jar文件真的有必要吗?您可以在这里找到它:。两者我都需要。我不明白为什么它是这样打包的,为什么Github自述中没有关于它的信息,但它对我有用。。。