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自述中没有关于它的信息,但它对我有用。。。